Funcion date en campo indice

From: Ruben C <rpgsql(at)gmail(dot)com>
To: PGSQL <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: Funcion date en campo indice
Date: 2011-08-03 20:28:24
Message-ID: CAKJXqcMVZ_u+wiDbAYGg6so08PnV-NfKWFye8yeWuBfebwU=yQ@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

Hola estimados
Hoy estuvo a punto de escribir una desesperada pregunta en la lista,
pero respire hondo y me contuve..... bueno a esta hora el problema ya esta
corregido pero me quedo con una duda respecto a postgres (8.1)

El tema es el sgte, en esta consulta:
tabla estado 8 millones de registros aprox y tabla solicitud 3 millones de
registros aprox., aqui va la consulta.
los campos de las condiciones estan indexados
y estan correctamente las FK y PK.

select s.id_solicitud,
rut_receptor as rut_responsable,
ruc,
s.id_documento,
s.estado_actual
from solicitud s
inner join estado e on e.id_solicitud=s.id_solicitud and
cod_tipoestado=1800 and date(fecha_cambio)='2011-08-02'
inner join autorizado a on a.rut = e.rut_receptor
where
estado_actual<>1500 and
( (s.id_documento >= 1 And s.id_documento <= 14)
or (s.id_documento >= 16 and s.id_documento <= 18)
......... (s.id_documento = 88))
and S.ID_SOLICITUD NOT IN (SELECT ID_SOLICITUD FROM GRABAR3 WHERE
ID_SOLICITUD=S.ID_SOLICITUD and fecha_accion > '2011-08-02 00:00:01')

Se tarda muchisimo es increible aqui les dejo el Explain Analyze

"Nested Loop (cost=0.00..215476.37 rows=16 width=89) (actual
time=284484.000..284484.000 rows=0 loops=1)"
" -> Nested Loop (cost=0.00..212564.73 rows=320 width=34) (actual
time=279437.000..279949.000 rows=419 loops=1)"
" -> Seq Scan on estado e (cost=0.00..206973.19 rows=982 width=21)
(actual time=279437.000..279468.000 rows=419 loops=1)"
" Filter: ((cod_tipoestado = 1800) AND (date(fecha_cambio) =
'2011-08-02'::date))"
" -> Index Scan using rut_idx on autorizado a (cost=0.00..5.68
rows=1 width=25) (actual time=0.072..1.148 rows=1 loops=419)"
" Index Cond: ((a.rut)::text = ("outer".rut_receptor)::text)"
" Filter: (cuenta_saf > ''::text)"
" -> Index Scan using id_solicitud on solicitud s (cost=0.00..9.09 rows=1
width=63) (actual time=10.785..10.785 rows=0 loops=419)"
" Index Cond: ("outer".id_solicitud = s.id_solicitud)"
" Filter: ((estado_actual <> 1500) AND (((id_documento >= 1) AND
(id_documento <= 14)) OR ((id_documento >= 16) AND (id_documento <= 18)) OR
((id_documento >= 20) AND (id_documento <= 21)) OR ((id_documento >= 23) AND
(id_documento <= 30)) OR ((id_documento >= 62) AND (id_documento <= 69)) OR
((id_documento >= 72) AND (id_documento <= 78)) OR ((id_documento >= 83) AND
(id_documento <= 85)) OR ((id_documento >= 120) AND (id_documento <= 133))
OR ((id_documento >= 135) AND (id_documento <= 136)) OR (id_documento = 138)
OR (id_documento = 59) OR (id_documento = 165) OR (id_documento = 36) OR
(id_documento = 168) OR (id_documento = 169) OR (id_documento = 170) OR
(id_documento = 171) OR (id_documento = 177) OR (id_documento = 112) OR
(id_documento = 172) OR (id_documento = 88)) AND (NOT (subplan)))"
" SubPlan"
" -> Index Scan using ind_idsol on grabar3 (cost=0.00..5.98
rows=1 width=8) (actual time=9.801..9.801 rows=1 loops=391)"
" Index Cond: (id_solicitud = $0)"
" Filter: (fecha_accion > '2011-08-02 00:00:01'::timestamp
without time zone)"
"Total runtime: 284484.000 ms"

Probando y probando, y luego de hablar con el encargado de sistemas,el cual
habia comenzado a investigar sobre como optimizar los querys saqué la
funcion date() de la consulta

select s.id_solicitud,
rut_receptor as rut_responsable,
ruc,
s.id_documento,
s.estado_actual
from solicitud s
inner join estado e on e.id_solicitud=s.id_solicitud and
cod_tipoestado=1800 and fecha_cambio>'2011-08-02 00:00:00' and
fecha_cambio<'2011-08-02 23:00:00'
inner join autorizado a on a.rut = e.rut_receptor
where
estado_actual<>1500 and
( (s.id_documento >= 1 And s.id_documento <= 14)
or (s.id_documento >= 16 and s.id_documento <= 18)
......... (s.id_documento = 88))
and S.ID_SOLICITUD NOT IN (SELECT ID_SOLICITUD FROM GRABAR3 WHERE
ID_SOLICITUD=S.ID_SOLICITUD and fecha_accion > '2011-08-02 00:00:01')

El explain analyze resultó asi

"Nested Loop (cost=0.00..17.92 rows=1 width=89) (actual
time=1515.000..1515.000 rows=0 loops=1)"
" -> Nested Loop (cost=0.00..8.82 rows=1 width=34) (actual
time=0.000..424.000 rows=419 loops=1)"
" -> Index Scan using fecha_cambio_idx on estado e (cost=0.00..3.12
rows=1 width=21) (actual time=0.000..31.000 rows=419 loops=1)"
" Index Cond: ((fecha_cambio > '2011-08-02 00:00:00'::timestamp
without time zone) AND (fecha_cambio < '2011-08-02 23:00:00'::timestamp
without time zone))"
" Filter: (cod_tipoestado = 1800)"
" -> Index Scan using rut_idx on autorizado a (cost=0.00..5.68
rows=1 width=25) (actual time=0.191..0.938 rows=1 loops=419)"
" Index Cond: ((a.rut)::text = ("outer".rut_receptor)::text)"
" Filter: (cuenta_saf > ''::text)"
" -> Index Scan using id_solicitud on solicitud s (cost=0.00..9.09 rows=1
width=63) (actual time=2.568..2.568 rows=0 loops=419)"
" Index Cond: ("outer".id_solicitud = s.id_solicitud)"
" Filter: ((estado_actual <> 1500) AND (((id_documento >= 1) AND
(id_documento <= 14)) OR ((id_documento >= 16) AND (id_documento <= 18)) OR
((id_documento >= 20) AND (id_documento <= 21)) OR ((id_documento >= 23) AND
(id_documento <= 30)) OR ((id_documento >= 62) AND (id_documento <= 69)) OR
((id_documento >= 72) AND (id_documento <= 78)) OR ((id_documento >= 83) AND
(id_documento <= 85)) OR ((id_documento >= 120) AND (id_documento <= 133))
OR ((id_documento >= 135) AND (id_documento <= 136)) OR (id_documento = 138)
OR (id_documento = 59) OR (id_documento = 165) OR (id_documento = 36) OR
(id_documento = 168) OR (id_documento = 169) OR (id_documento = 170) OR
(id_documento = 171) OR (id_documento = 177) OR (id_documento = 112) OR
(id_documento = 172) OR (id_documento = 88)) AND (NOT (subplan)))"
" SubPlan"
" -> Index Scan using ind_idsol on grabar3 (cost=0.00..5.98
rows=1 width=8) (actual time=1.079..1.079 rows=1 loops=391)"
" Index Cond: (id_solicitud = $0)"
" Filter: (fecha_accion > '2011-08-02 00:00:01'::timestamp
without time zone)"
"Total runtime: 1515.000 ms"

Porque la diferencia es tanta??. será bueno de todas formas pedir al
administrador que configure PostgreSql para que sea mas eficiente en las
querys?
Les agradezco su ayuda.
Tambien les quisiera pedir un poco de ayuda respecto a interpretar bien los
Explain Analyze, se que sale en el manual pero me gustaria profundizar mas y
realmente comprenderlos.
Saludos y gracias!

In response to

Responses

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message suso 2011-08-03 20:33:28 listado complejo...o engorroso
Previous Message Gilberto Castillo Martínez 2011-08-03 20:09:36 Re: listado complejo...o engorroso