Mejorar performance de un query.

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.

In response to

Responses

Browse pgsql-es-ayuda by date

  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