prioridad de indices en una consulta

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: Raw Message | Whole Thread | 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.

Responses

Browse pgsql-es-ayuda by date

  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)