RE: Mejorar performance de un query.

From: "Esteban Osorio" <eosorio(at)economia(dot)cl>
To: <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: RE: Mejorar performance de un query.
Date: 2007-05-07 17:23:44
Message-ID: 5F3665C0E294BC43B3A635CA66D94B74013E1F94@buzones.economia.cl
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

Realizo un vacuum diario por las noches utilizando la siguiente instrucción:

vacuumdb -U postgres -v -z -d base_de_datos

He creado tantos índices como he visto que sean necesarios.

Saludos,
Esteban.

-----Mensaje original-----
De: Leonel [mailto:lnunez(at)gmail(dot)com]
Enviado el: Viernes, 04 de Mayo de 2007 21:47
Para: Esteban Osorio
CC: pgsql-es-ayuda(at)postgresql(dot)org
Asunto: Re: [pgsql-es-ayuda] Mejorar performance de un query.

On 5/4/07, Esteban Osorio <eosorio(at)economia(dot)cl> wrote:
>
>
>
>
> 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???
>
>

de entrada 2

1 vacuum
2 indices

--
Leonel

In response to

Responses

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Mario Soto 2007-05-07 17:36:03 Consulta
Previous Message Arturo Munive 2007-05-07 17:23:11 Re: Herencia?