From: | "Esteban Osorio" <eosorio(at)economia(dot)cl> |
---|---|
To: | <pgsql-es-ayuda(at)postgresql(dot)org> |
Subject: | Mejorar performance de un query. |
Date: | 2007-05-04 21:52:50 |
Message-ID: | 5F3665C0E294BC43B3A635CA66D94B74013E1A5A@buzones.economia.cl |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-es-ayuda |
Hola a todos,
Tengo una consulta que esta tomando mucho tiempo en ejecutarse y quisiera saber si alguien me puede dar luces para mejorar esto. La consulta es la siguiente:
explain analyze select distinct docto.barra as barra, docto.copia as copia, to_char(docto.fecha,'dd-mm-yyyy') as fecha,
numero, origen.descripcion as desc_origen, origen2, referencia, nombre, notas
from docto
left outer join origen on (origen = cod_origen)
inner join historia on (docto.barra = historia.barra and docto.copia = historia.copia)
inner join tb_usuario on (historia.comodin = tb_usuario.cod_usuario)
where movimiento = 'A' and actual = 1100
and (historia.barra, historia.copia) in (select barra, copia from historia where movimiento = 'C'
and actual = 1100
and historia.fecha between to_date('04-04-2007','dd-mm-yyyy') and to_date('04-04-2007','dd-mm-yyyy'))
and historia.fecha between to_date('04-04-2007','dd-mm-yyyy') and to_date('04-04-2007','dd-mm-yyyy')
order by barra, copia, nombre
Lo cual me da el siguiente resultado:
Unique (cost=21435.06..21435.09 rows=1 width=221) (actual time=53617.778..53618.047 rows=68 loops=1)
-> Sort (cost=21435.06..21435.06 rows=1 width=221) (actual time=53617.774..53617.848 rows=68 loops=1)
Sort Key: docto.barra, docto.copia, tb_usuario.nombre, to_char((docto.fecha)::timestamp with time zone, 'dd-mm-yyyy'::text), docto.numero, origen.descripcion, docto.origen2, docto.referencia, docto.notas
-> Nested Loop IN Join (cost=17340.22..21435.05 rows=1 width=221) (actual time=2137.102..53617.099 rows=68 loops=1)
Join Filter: (("inner".copia = "outer".copia) AND ("inner".barra = "outer".barra))
-> Nested Loop (cost=17340.22..21429.08 rows=1 width=245) (actual time=2137.004..53571.276 rows=71 loops=1)
Join Filter: (("inner".barra = "outer".barra) AND ("inner".copia = "outer".copia))
-> Nested Loop (cost=0.00..11.66 rows=1 width=43) (actual time=0.109..4.261 rows=71 loops=1)
-> Index Scan using idx_hist_fecha on historia (cost=0.00..5.95 rows=1 width=34) (actual time=0.079..1.998 rows=71 loops=1)
Index Cond: ((fecha >= '2007-04-04'::date) AND (fecha <= '2007-04-04'::date))
Filter: ((movimiento = 'A'::bpchar) AND (actual = 1100::numeric))
-> Index Scan using tb_usuario_pk on tb_usuario (cost=0.00..5.70 rows=1 width=29) (actual time=0.019..0.024 rows=1 loops=71)
Index Cond: ("outer".comodin = tb_usuario.cod_usuario)
-> Merge Right Join (cost=17340.22..19368.35 rows=136605 width=202) (actual time=25.281..557.973 rows=136605 loops=71)
Merge Cond: ("outer".cod_origen = "inner".origen)
-> Index Scan using origen_pk on origen (cost=0.00..6.50 rows=182 width=33) (actual time=0.006..0.482 rows=178 loops=71)
-> Sort (cost=17340.22..17681.73 rows=136605 width=189) (actual time=25.265..174.424 rows=136605 loops=71)
Sort Key: docto.origen
-> Seq Scan on docto (cost=0.00..5688.05 rows=136605 width=189) (actual time=0.008..282.437 rows=136605 loops=1)
-> Index Scan using idx_hist_fecha on historia (cost=0.00..5.95 rows=1 width=24) (actual time=0.046..0.548 rows=36 loops=71)
Index Cond: ((fecha >= '2007-04-04'::date) AND (fecha <= '2007-04-04'::date))
Filter: ((movimiento = 'C'::bpchar) AND (actual = 1100::numeric))
Total runtime: 53646.198 ms
Prácticamente todos los campos involucrados, menos los de naturaleza de caracteres, tienen índices que utilizan btree. Además la tabla historia tiene alrededor de 1,5 millones de registros.
Alguna sugerencia???
Saludos,
Esteban Osorio.
From | Date | Subject | |
---|---|---|---|
Next Message | decastro | 2007-05-04 22:21:43 | Conectarse desde Visual FoxPro usando ADO |
Previous Message | Roberto Andrade Fonseca | 2007-05-04 21:23:28 | Re: Problemas con un string en un insert |