| From: | Edwin Perez Lozano <edwinandperez(at)gmail(dot)com> | 
|---|---|
| To: | pgsql-es-ayuda(at)postgresql(dot)org | 
| Subject: | prioridad de indices en una consulta | 
| Date: | 2007-11-13 21:19:30 | 
| Message-ID: | 1194988770.23071.16.camel@localhost | 
| Views: | Whole Thread | Raw Message | Download mbox | Resend email | 
| Thread: | |
| Lists: | pgsql-es-ayuda | 
Buen dia a todos...
tengo la siguiente consulta:
explain analyze SELECT numero_guia,fecha_manifiesto,d.descripcion as
destino,o.descripcion as
origen,g.consecutivo_registro,g.nombre_remitente,g.telefono_remitente,g.nombre_destinatario,c.concepto,c.descripcion_concepto,CASE WHEN g.tipo_estado=10 THEN 'TRANSITO' ELSE 'MANIFESTO' END as estado  
FROM guia g inner join ubicacion d on
(d.codigo_ubicacion=g.ciudad_destino)
inner join concepto c on (c.codigo_concepto=g.codigo_concepto)
inner join ubicacion o on (o.codigo_ubicacion=g.ciudad_origen)
WHERE g.fecha_manifiesto='2007-10-29' and g.ciudad_origen=12601
y el resultado es el siguiente:
Nested Loop  (cost=2262.36..2279.27 rows=183 width=1216) (actual
time=19347.943..19347.943 rows=0 loops=1)
->  Index Scan using pk_ubicacion on ubicacion o  (cost=0.00..8.27
rows=1 width=222) (actual time=27.132..27.144 rows=1 loops=1)
Index Cond: (12601 = codigo_ubicacion)
 ->  Hash Join  (cost=2262.36..2268.72 rows=183 width=1002) (actual
time=19320.787..19320.787 rows=0 loops=1)
 Hash Cond: (g.ciudad_destino = d.codigo_ubicacion)
  ->  Merge Join  (cost=2236.24..2240.08 rows=183 width=788) (actual
time=19319.008..19319.008 rows=0 loops=1)
  Merge Cond: (g.codigo_concepto = c.codigo_concepto)
   ->  Sort  (cost=2223.53..2223.99 rows=183 width=560) (actual
time=19319.004..19319.004 rows=0 loops=1)
   Sort Key: g.codigo_concepto
    ->  Bitmap Heap Scan on guia g  (cost=1496.94..2216.65 rows=183
width=560) (actual time=19318.934..19318.934 rows=0 loops=1)
    Recheck Cond: ((ciudad_origen = 12601) AND (fecha_manifiesto =
'2007-10-29'::date))
     ->  BitmapAnd  (cost=1496.94..1496.94 rows=183 width=0) (actual
time=19318.926..19318.926 rows=0 loops=1)
      ->  Bitmap Index Scan on idx_guia_5  (cost=0.00..748.30 rows=36681
width=0) (actual time=19220.018..19220.018 rows=1678544 loops=1)
      Index Cond: (ciudad_origen = 12601)
       ->  Bitmap Index Scan on idx_guia_11  (cost=0.00..748.30
rows=36681 width=0) (actual time=82.263..82.263 rows=1 loops=1)
      Index Cond: (fecha_manifiesto = '2007-10-29'::date)
       ->  Sort  (cost=12.70..13.25 rows=219 width=234) (never executed)
      Sort Key: c.codigo_concepto
       ->  Seq Scan on concepto c  (cost=0.00..4.19 rows=219 width=234)
(never executed)
 ->  Hash  (cost=15.50..15.50 rows=850 width=222) (actual
time=1.659..1.659 rows=850 loops=1)
 ->  Seq Scan on ubicacion d  (cost=0.00..15.50 rows=850 width=222)
(actual time=0.012..0.735 rows=850 loops=1)
Total runtime: 19351.929 ms
La consulta es muy lenta y por lo que pude observar es porque el explain
me dice que primero hace :
->  Bitmap Index Scan on idx_guia_5  (cost=0.00..748.30 rows=36681
width=0) (actual time=19220.018..19220.018 rows=1678544 loops=1)
      Index Cond: (ciudad_origen = 12601)
y luego hace el de fecha el cual me trae una cantidad menor de datos:
 ->  Bitmap Index Scan on idx_guia_11  (cost=0.00..748.30 rows=36681
width=0) (actual time=82.263..82.263 rows=1 loops=1)
      Index Cond: (fecha_manifiesto = '2007-10-29'::date)
La consulta no deberia primero aplicar el condicional de la fecha y
luego aplicar el otro condicional (ciudad_origen) pero no encuentro la
forma de indicarselo en el sql, alguien sabe como indicarselo al
postgres?¿
De antemano gracias por la info que puedan darme.
| From | Date | Subject | |
|---|---|---|---|
| Next Message | Alvaro Herrera | 2007-11-13 22:13:38 | Re: prioridad de indices en una consulta | 
| Previous Message | Yoel Mc Lennan | 2007-11-13 20:50:55 | Re: [pgsql-es-ayuda] Ordenar la cosnulta segun orden de creación de campos o (OID de campo) y devolver schemma de un FK determinado (pongo sql deejemplo) |