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!