No usa índice

From: "Raul Andres Duque" <ra_duque(at)yahoo(dot)com(dot)mx>
To: <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: No usa índice
Date: 2007-09-11 14:58:21
Message-ID: 009001c7f484$32d9bf60$5800a8c0@amadeus.net.co
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

Cordial Saludo Compañeros:

Básicamente tengo un query donde filtro por un rango de fechas (usando BETWEEN), cómo la tabla va a crecer mucho, he creado un índice por el campo "fecha_movimiento" pero mi query no lo usa (hace un seq scan), por qué será?

El query es:

SELECT KARDEX.id_almacen, descripcion_almacen,
KARDEX.id_localizacion, descripcion_localizacion,
KARDEX.id_parte, descripcion_parte,
EntradaReal, SalidaReal,
EntradaReal2, SalidaReal2,
EntradaComprometido, SalidaComprometido,
EntradaTransito, SalidaTransito
FROM
(
SELECT id_almacen, id_localizacion, id_parte,
SUM(CASE WHEN cantidad_movimiento > 0 AND id_tipoafectareal > 1 THEN cantidad_movimiento ELSE 0 END) as EntradaReal,
SUM(CASE WHEN cantidad_movimiento < 0 AND id_tipoafectareal > 1 THEN cantidad_movimiento*-1 ELSE 0 END) as SalidaReal,
SUM(CASE WHEN cantidad_movimiento > 0 AND id_tipoafectareal2 > 1 THEN cantidad_movimiento ELSE 0 END) as EntradaReal2,
SUM(CASE WHEN cantidad_movimiento < 0 AND id_tipoafectareal2 > 1 THEN cantidad_movimiento*-1 ELSE 0 END) as SalidaReal2,
SUM(CASE WHEN cantidad_movimiento > 0 AND id_tipoafectacomprometido > 1 THEN cantidad_movimiento ELSE 0 END) as EntradaComprometido,
SUM(CASE WHEN cantidad_movimiento < 0 AND id_tipoafectacomprometido > 1 THEN cantidad_movimiento*-1 ELSE 0 END) as SalidaComprometido,
SUM(CASE WHEN cantidad_movimiento > 0 AND id_tipoafectatransito> 1 THEN cantidad_movimiento ELSE 0 END) as EntradaTransito,
SUM(CASE WHEN cantidad_movimiento < 0 AND id_tipoafectatransito > 1 THEN cantidad_movimiento*-1 ELSE 0 END) as SalidaTransito
FROM (
SELECT MOVI.id_almacen, MOVI.id_localizacion, MOVI.id_parte, cantidad_movimiento,
id_tipoafectareal, id_tipoafectareal2, id_tipoafectacomprometido, id_tipoafectatransito
FROM def_movimiento MOVI JOIN def_traninve TINV ON MOVI.id_traninve = TINV.id_traninve
JOIN def_parte PART ON MOVI.id_parte = PART.id_parte
WHERE serial_parte = '0'
AND fecha_movimiento BETWEEN '1/1/2007' AND '31/12/2007'
) MOVIMIENTO
GROUP BY id_almacen, id_localizacion, id_parte
) KARDEX
JOIN def_almacen ALMA ON KARDEX.id_almacen = ALMA.id_almacen
JOIN def_localizacion LOCA ON KARDEX.id_almacen = LOCA.id_almacen AND KARDEX.id_localizacion = LOCA.id_localizacion
JOIN def_parte PART ON KARDEX.id_parte = PART.id_parte

Y su plan de ejecucción es:

"Nested Loop (cost=892.02..914.13 rows=1 width=153)"
" -> Hash Join (cost=892.02..910.32 rows=1 width=121)"
" Hash Cond: ((kardex.id_almacen = loca.id_almacen) AND (kardex.id_localizacion = loca.id_localizacion))"
" -> Hash Join (cost=887.90..906.13 rows=5 width=81)"
" Hash Cond: (kardex.id_almacen = alma.id_almacen)"
" -> HashAggregate (cost=886.78..902.30 rows=194 width=32)"
" -> Hash Join (cost=197.81..881.45 rows=194 width=32)"
" Hash Cond: (movi.id_traninve = tinv.id_traninve)"
" -> Hash Join (cost=196.20..877.17 rows=194 width=20)"
" Hash Cond: (movi.id_parte = part.id_parte)"
" -> Seq Scan on def_movimiento movi (cost=0.00..606.63 rows=19305 width=20)"
" Filter: ((fecha_movimiento >= '2007-01-01 00:00:00'::timestamp without time zone) AND (fecha_movimiento <= '2007-12-31 00:00:00'::timestamp without time zone))"
" -> Hash (cost=195.07..195.07 rows=91 width=4)"
" -> Bitmap Heap Scan on def_parte part (cost=4.96..195.07 rows=91 width=4)"
" Recheck Cond: ((serial_parte)::text = '0'::text)"
" -> Bitmap Index Scan on idx_parte_serial (cost=0.00..4.93 rows=91 width=0)"
" Index Cond: ((serial_parte)::text = '0'::text)"
" -> Hash (cost=1.27..1.27 rows=27 width=20)"
" -> Seq Scan on def_traninve tinv (cost=0.00..1.27 rows=27 width=20)"
" -> Hash (cost=1.05..1.05 rows=5 width=21)"
" -> Seq Scan on def_almacen alma (cost=0.00..1.05 rows=5 width=21)"
" -> Hash (cost=2.85..2.85 rows=85 width=52)"
" -> Seq Scan on def_localizacion loca (cost=0.00..2.85 rows=85 width=52)"
" -> Index Scan using key_parte on def_parte part (cost=0.00..3.79 rows=1 width=36)"
" Index Cond: (kardex.id_parte = part.id_parte)"

Gracias.

Atentamente,

RAUL DUQUE
Bogotá, Colombia

Responses

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Alejandro D. Burne 2007-09-11 15:30:06 Re: Restore, AYUDA !!!
Previous Message Raul Andres Duque 2007-09-11 14:54:14 No se usa indice