Re: problema con query lento

From: Silvio Quadri <silvioq(at)gmail(dot)com>
To: Diego Ayala <netdiego81(at)gmail(dot)com>
Cc: Postgres Ayuda <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: Re: problema con query lento
Date: 2011-04-14 15:00:49
Message-ID: BANLkTinFHEo+DQMh9nvheUudFQfwTpyYrw@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

El día 14 de abril de 2011 10:40, Diego Ayala <netdiego81(at)gmail(dot)com> escribió:
> Silvio, realmente ahora si no entiendo nada.. le cambie el order by por otro
> campo, que no es el item.id y el explain m devuelve esto,
>  explain analyze SELECT llamado_grupo.id as grupo_id,llamado_grupo.nro_
> grupo, llamado_grupo.abastecimiento_simultaneo,
>  llamado_grupo.contrato_abierto , item.id as item_id,  item.cantidad,
> item.cantidad_minima,  item.descripcion,
>    item.estado,  item.nro_linea,  item.precio_promedio_catalogo,
> item.precio_unitario,  item.unidad_medida,
>     item.zona,producto_n5.id as prod_id,producto_n5.codigo,
> item.usuario_alta
>       FROM sicp.item_solicitado item
>       INNER JOIN  catalogo.producto_n5 producto_n5 on
> item.producto_n5_id=producto_n5.id
>       INNER JOIN sicp.llamado_grupo llamado_grupo on llamado_grupo.id =
> item.llamado_grupo_id
>        WHERE  llamado_grupo.llamado_id = 127968
>            and item.ver= true
>         order by  item.nro_linea
>         desc limit 10
>         offset 0
>
> "Limit  (cost=7092.42..7092.45 rows=10 width=127) (actual time=0.193..0.199
> rows=2 loops=1)"
> "  ->  Sort  (cost=7092.42..7099.73 rows=2924 width=127) (actual
> time=0.191..0.193 rows=2 loops=1)"
> "        Sort Key: item.nro_linea"
> "        Sort Method:  quicksort  Memory: 25kB"
> "        ->  Nested Loop  (cost=0.00..7029.24 rows=2924 width=127) (actual
> time=0.146..0.177 rows=2 loops=1)"
> "              ->  Nested Loop  (cost=0.00..6203.84 rows=2924 width=115)
> (actual time=0.131..0.150 rows=2 loops=1)"
> "                    ->  Index Scan using idx_llamado_grupo_id_llamado_id on
> llamado_grupo  (cost=0.00..54.30 rows=27 width=14) (actual time=0.085..0.090
> rows=2 loops=1)"
> "                          Index Cond: (llamado_id = 127968)"
> "                    ->  Index Scan using idx_item_llamado_grupo_id_item_id
> on item_solicitado item  (cost=0.00..226.41 rows=108 width=109) (actual
> time=0.024..0.025 rows=1 loops=2)"
> "                          Index Cond: (item.llamado_grupo_id =
> llamado_grupo.id)"
> "                          Filter: item.ver"
> "              ->  Index Scan using producto_n5_pkey on producto_n5
> (cost=0.00..0.27 rows=1 width=20) (actual time=0.008..0.009 rows=1 loops=2)"
> "                    Index Cond: (producto_n5.id = item.producto_n5_id)"
> "Total runtime: 0.333 ms"
>
> Cambio totalmente el resultado con solo cambiar el campo por el cual
> ordenaba(antes era item.id, ahora le puse item.nro_linea), esto en
> produccion... por que en desarrollo con el campo item.id en order by, igual
> m arrojaba un buen plan..

Como decía prueba y error ...
Como me gusta opinar de cosas que desconozco, tiro una teoría ...

El order by quizás confunda un poco al motor, .... Pensá cómo lo haría
un programador ... hay dos formas de resolver tu problema.
1) recorrer primero la tabla item por id en forma descendente y luego
aplicar filtros
2) aplicar primero los filtros y luego ordenar por id descendente de
lo que queda.

El motor tiene que determinar, en milisegundos y en base a sus
estadísticas, cuál de las dos formas es mejor. Si vos estás convencido
de que lo segundo es lo mejor, podrías obligar al motor a hacerlo.
Hacete un subquery con todo sin ordenar y ordená por fuera ... te
debería quedar un sql así.

select * from ( select todos, tus, campos from tus_tablas where
tus_condiciones ) a order by id desc limit 10

Pruebe y cuente amigo, que no cuesta nada!
Silvio

>
> El 13 de abril de 2011 16:09, Silvio Quadri <silvioq(at)gmail(dot)com> escribió:
>>
>> El día 13 de abril de 2011 16:43, Alvaro Herrera
>> <alvherre(at)alvh(dot)no-ip(dot)org> escribió:
>> > Excerpts from Diego Ayala's message of mié abr 13 16:34:10 -0300 2011:
>> >> estos son los indices sobre la tabla item_solicitado
>> >
>> > Es posible que esta consulta se beneficie de este indice:
>> >
>> > create index llamado_grupo_id_llamado_id on llamado_grupo (id,
>> > llamado_id);
>> >
>> > Pruebalo y nos cuentas
>> >
>>
>> Si no funciona probá también
>> a) modificar el índice (llamado_grupo_id) por (llamado_grupo_id, id desc).
>> b) sacarle el order del final a ver si cambia el plan.
>> c) Hacelo con un join implícito, es muy poco probable que cambie algo,
>> pero no cuesta nada.
>>
>> Silvio
>
>

--
Silvio Quadri

In response to

Responses

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Anthony Rafael Sotolongo Leon 2011-04-14 15:02:57 Re: Presentación y solicitud de recomendación
Previous Message Moises Alberto Lindo Gutarra 2011-04-14 14:52:41 Re: [pgsql-es-ayuda] Re: [pgsql-es-ayuda] Presentación y solicitud de recomendación