SQL Tuning

From: "Enrique Alejandro Barrios" <EBARRIOS(at)metrogas(dot)com(dot)ar>
To: <pgsql-general(at)postgresql(dot)org>
Subject: SQL Tuning
Date: 2006-08-29 17:59:42
Message-ID: s4f45672.063@mggwmail1
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-general

Hola, soy nuevo por acá, quisiera saber si me pueden ayudar para ver que modificaciones puedo hacerle a esta consulta para que funciones mas rápido ya que como esta ahora consume mucha cpu y memoria.
desde ya muchas gracias.
saludos

query

SELECT DISTINCT
t.id,
emp.descripcion as contratista,
fecha_etapa_cod(eh.idetapa , '12') as asignado ,
t.id AS calden,
trabajosistemao.reclamo,
tt.descripcion,
oc.calle,
oc.numero,
s.descripcion || ' - ' || s.medida || ' - ' || s.tipo AS solado,
oc.cantidad,
oc.largo,
oc.ancho,
oc.profundidad,
oc.piezas,
entrecalle_siade_cod(trabajosistemao.reclamo) as entrecalle

FROM ((((obracivil AS oc INNER JOIN etapahead AS eh ON oc.idetapa = eh.idetapa)
INNER JOIN trabajo AS t ON eh.idtrabajo = t.id)
INNER JOIN aprobacion AS ap ON ap.idetapa = eh.idetapa)
INNER JOIN solado AS s ON oc.idsolado = s.idsolado)
LEFT JOIN trabajosistemao ON t.id = trabajosistemao.id, empresa emp, tipotrabajo tt

WHERE fecha_etapa_cod(eh.idetapa , '3') is null AND
(oc.discrim)='D' AND

emp.idcontratista = empresa_etapa_cod(eh.idetapa) AND

tt.idtipotrabajo = idtipotrabajo_etapa_cod(eh.idetapa) AND

empresa_etapa_cod(eh.idetapa) in (500189) AND

fecha_etapa_cod(eh.idetapa , '12') between '2006-05-30' and '2006-06-30'

--select max(fecha) from aprobacion where idetapa = $1 and idestado = $2
--INNER JOIN aprobacion AS ap ON ap.idetapa = eh.idetapa)

UNION

SELECT
eh.idtrabajo as id,
emp.descripcion as contratista,
aprobacion.fecha as asignado ,
eh.idtrabajo as calden,
trabajosistemao.reclamo,
tt.descripcion,
oc.calle,
oc.numero,
'' as solado,
oc.cantidad,
oc.largo,
oc.ancho,
oc.profundidad,
oc.piezas,
entrecalle_siade_cod(trabajosistemao.reclamo) as entrecalle
FROM (((
trabajosistemao INNER JOIN etapahead AS eh ON trabajosistemao.id = eh.idtrabajo)
LEFT JOIN obracivil AS oc ON eh.idetapa = oc.idetapa)
INNER JOIN aprobacion ON eh.idetapa = aprobacion.idetapa)
INNER JOIN trabajo AS t ON trabajosistemao.id = t.id, empresa emp, tipotrabajo tt
WHERE (((trabajosistemao.reclamo) Is Not Null) AND ((oc.idetapa) Is Null) AND ((eh.idetapa) Not In (SELECT DISTINCT etapamecanica.idetapa FROM etapamecanica INNER JOIN aprobacion ON etapamecanica.idetapa = aprobacion.idetapa WHERE (((aprobacion.idestado)='3')))) AND ((aprobacion.idestado)='12'))
AND emp.idcontratista = empresa_etapa_cod(eh.idetapa)
AND tt.idtipotrabajo = idtipotrabajo_etapa_cod(eh.idetapa)
AND empresa_etapa_cod(eh.idetapa) in (500189)
AND aprobacion.fecha between '2006-05-30' and '2006-06-30';

Explain output
*---------------

Unique (cost=193218032.67..193218032.75 rows=1 width=278)
-> Sort (cost=193218032.67..193218032.67 rows=2 width=278)
Sort Key: id, contratista, asignado, calden, reclamo, descripcion, calle, numero, solado, cantidad, largo, ancho, profundidad, piezas, entrecalle
-> Append (cost=1707.38..193218032.66 rows=2 width=278)
-> Subquery Scan "*SELECT* 1" (cost=1707.38..1707.43 rows=1 width=278)
-> Unique (cost=1707.38..1707.43 rows=1 width=278)
-> Sort (cost=1707.38..1707.39 rows=1 width=278)
Sort Key: t.id, emp.descripcion, fecha_etapa_cod(eh.idetapa, 12::numeric), t.id, trabajosistemao.reclamo, tt.descripcion, oc.calle, oc.numero, ((((s.descripcion || ' - '::character varying) || s.medida) || ' - '::character varying) || s.tipo), oc.cantidad, oc.largo, oc.ancho, oc.profundidad, oc.piezas, entrecalle_siade_cod(trabajosistemao.reclamo)
-> Nested Loop (cost=1624.89..1707.37 rows=1 width=278)
Join Filter: ("inner".idtipotrabajo = idtipotrabajo_etapa_cod("outer".idetapa))
-> Nested Loop (cost=1624.89..1705.57 rows=1 width=246)
Join Filter: ("inner".idcontratista = empresa_etapa_cod("outer".idetapa))
-> Nested Loop (cost=1624.89..1691.56 rows=10 width=220)
-> Hash Join (cost=1624.89..1630.10 rows=10 width=192)
Hash Cond: ("outer".idsolado = "inner".idsolado)
-> Seq Scan on solado s (cost=0.00..3.37 rows=137 width=47)
-> Hash (cost=1624.86..1624.86 rows=10 width=145)
-> Nested Loop (cost=0.00..1624.86 rows=10 width=145)
-> Nested Loop (cost=0.00..1609.53 rows=1 width=133)
-> Nested Loop (cost=0.00..1603.66 rows=1 width=120)
-> Seq Scan on etapahead eh (cost=0.00..1589.87 rows=1 width=25)
Filter: ((fecha_etapa_cod(idetapa, 3::numeric) IS NULL) AND (empresa_etapa_cod(idetapa) = 500189::numeric) AND (fecha_etapa_cod(idetapa, 12::numeric) >= '2006-05-30'::date) AND (fecha_etapa_cod(idetapa, 12::numeric) <= '2006-06-30'::date))
-> Index Scan using unic_etapa_discrim_civil on obracivil oc (cost=0.00..13.75 rows=3 width=95)
Index Cond: ((oc.idetapa = "outer".idetapa) AND (oc.discrim = 'D'::character varying))
-> Index Scan using trabajo_pkey on trabajo t (cost=0.00..5.85 rows=1 width=13)
Index Cond: ("outer".idtrabajo = t.id)
-> Index Scan using aprob_idetapa_fk on aprobacion ap (cost=0.00..15.21 rows=10 width=12)
Index Cond: (ap.idetapa = "outer".idetapa)
-> Index Scan using trabajosistemao_pkey on trabajosistemao (cost=0.00..5.91 rows=1 width=28)
Index Cond: ("outer".id = trabajosistemao.id)
-> Seq Scan on empresa emp (cost=0.00..1.14 rows=14 width=26)
-> Seq Scan on tipotrabajo tt (cost=0.00..1.32 rows=32 width=32)
-> Subquery Scan "*SELECT* 2" (cost=0.00..193216325.23 rows=1 width=227)
-> Nested Loop (cost=0.00..193216325.23 rows=1 width=227)
Join Filter: ("inner".idtipotrabajo = idtipotrabajo_etapa_cod("outer".idetapa))
-> Nested Loop (cost=0.00..193216323.43 rows=1 width=195)
Join Filter: ("inner".idcontratista = empresa_etapa_cod("outer".idetapa))
-> Nested Loop (cost=0.00..193216317.31 rows=5 width=169)
Join Filter: ("outer".id = "inner".id)
-> Nested Loop (cost=0.00..193216290.75 rows=5 width=156)
-> Nested Loop (cost=0.00..193215681.46 rows=40 width=140)
Filter: ("inner".idetapa IS NULL)
-> Nested Loop (cost=0.00..193214722.13 rows=40 width=53)
-> Seq Scan on trabajosistemao (cost=0.00..692.51 rows=15170 width=28)
Filter: (reclamo IS NOT NULL)
-> Index Scan using "etapahead_idtrabajo_FK" on etapahead eh (cost=0.00..12736.64 rows=1 width=25)
Index Cond: ("outer".id = eh.idtrabajo)
Filter: ((empresa_etapa_cod(idetapa) = 500189::numeric) AND (subplan))
SubPlan
-> Materialize (cost=11227.21..11227.21 rows=832 width=24)
-> Unique (cost=8624.26..11227.21 rows=832 width=24)
-> Merge Join (cost=8624.26..11206.41 rows=8322 width=24)
Merge Cond: ("outer".idetapa = "inner".idetapa)
-> Index Scan using etapamecanica_pkey on etapamecanica (cost=0.00..2354.51 rows=36177 width=12)
-> Sort (cost=8624.26..8645.07 rows=8322 width=12)
Sort Key: aprobacion.idetapa
-> Seq Scan on aprobacion (cost=0.00..8082.38 rows=8322 width=12)
Filter: (idestado = 3::numeric)
-> Index Scan using unic_etapa_discrim_civil on obracivil oc (cost=0.00..24.01 rows=6 width=87)
Index Cond: ("outer".idetapa = oc.idetapa)
-> Index Scan using aprob_idetapa_fk on aprobacion (cost=0.00..15.29 rows=1 width=16)
Index Cond: ("outer".idetapa = aprobacion.idetapa)
Filter: ((idestado = 12::numeric) AND (fecha >= '2006-05-30'::date) AND (fecha <= '2006-06-30'::date))
-> Index Scan using trabajo_pkey on trabajo t (cost=0.00..5.85 rows=1 width=13)
Index Cond: (t.id = "outer".idtrabajo)
-> Seq Scan on empresa emp (cost=0.00..1.14 rows=14 width=26)
-> Seq Scan on tipotrabajo tt (cost=0.00..1.32 rows=32 width=32)

*********************************************************************

¡IMPORTANTE!

Para evitar accidentes por inhalación de monóxido de carbono:
- Mantenga los ambientes ventilados en forma permanente.
- Revise que la llama sea color azul y uniforme.
- Instale y haga revisar periódicamente sus artefactos sólo a través
de gasistas matriculados.

Recuerde que los artefactos a gas pueden emitir Monóxido de Carbono:
un gas altamente tóxico e imperceptible.

Más consejos en http://www.metrogas.com.ar

*********************************************************************

--------------------------------------------------
Este mensaje es privado y confidencial
y va dirigido sólo al destinatario indicado.
Si usted lo ha recibido por error, por favor
avísenos inmediatamente vía e-mail a
error-mail(at)metrogas(dot)com(dot)ar y tenga la amabilidad
de eliminarlo de su sistema.
La utilización o divulgación del contenido del
mismo puede importar la comisión de un delito.
No copie, reproduzca o divulgue su contenido,
sea en forma parcial o total.
Cualquier opinión contenida, es exclusiva
de su autor y no representa necesariamente
la opinión de MetroGAS S.A. - Muchas gracias.
--------------------------------------------------
This message is private and confidential and it
is only intended for the addressee named above.
If you have received this message and it is not
addressed to you, please advise us immediately at
error-mail(at)metrogas(dot)com(dot)ar and kindly remove it
from your system.
The use or disclosure of the contents of this
message may be regarded as an offense.
Do not copy, reproduce or disclose them,
either partially or fully.
Opinions are the exclusive responsibility
of the author and do not necessarily represent
the opinion of MetroGAS S.A. - Thank you very much.
--------------------------------------------------
:: http://www.metrogas.com.ar

Browse pgsql-general by date

  From Date Subject
Next Message Seneca Cunningham 2006-08-29 18:04:25 Re: strange sum behaviour
Previous Message Peter Eisentraut 2006-08-29 17:57:55 Re: strange sum behaviour