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) |