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
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 |