Re: Tuning auna consulta

From: Silvio Quadri <silvioq(at)gmail(dot)com>
To: Vida Luz Arista <vida(dot)arista(at)ideay(dot)net(dot)ni>
Cc: pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: Tuning auna consulta
Date: 2009-07-16 18:57:28
Message-ID: 61dc71dc0907161157v49b8fc63y4ccf3ed62f6c392f@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

2009/7/15 Vida Luz Arista <vida(dot)arista(at)ideay(dot)net(dot)ni>:
> Hola a todos,
>
>
>
> Tengo un problema con una consulta, uno de los chicos de desarrollo, tiene
> una consulta que se hace pesada, y esta tarde como unos 2 minutos, lo más
> extraño es que no hay muchos registros y estos es demasiado tiempo sobre
> todo porque aun son pocos registros, me asusta porque cuando la BD crezca
> esto va ser demasiado tiempo, en esta consulta se trabaja con 15 tablas, la
> consulta se las dejo y les pido sugerencias para mejorar la consulta o si es
> posible partirla.
>
>
>
> Consulta
>
> ========
>
>
>
> SELECT DISTINCT emp.id_empresa AS Id_Empresa, emp.nombre AS Empresa,
>
> (
>
>        SELECT ta2.descripcion FROM data_empresa.empresa e2
>
>        INNER JOIN  data_empresa.empresa_actividad ea2
>
>        ON (ea2.id_empresa = e2.id_empresa )
>
>        INNER JOIN data_proyecto.tipo_actividad ta2
>
>        ON (ta2.id_actividad = ea2.id_actividad)
>
>        WHERE ea2.principal = true AND e2.id_empresa = emp.id_empresa
>
> ) AS Actividad,
>
> (case when ta.descripcion is not null then ta.descripcion else 'Ninguna'
> End) AS SubActividad,
>
> tca.descripcion AS Categoria,
>
> dep.descripcion AS Departamento,
>
> mun.nombre AS Municipio,
>
> (CASE WHEN dis.nombre IS NOT NULL THEN dis.nombre ELSE 'Ninguno' END) AS
> Distrito,
>
> (CASE WHEN emp.direccion IS NOT NULL THEN emp.direccion ELSE 'Ninguno' END)
> AS Direccion,
>
> (CASE WHEN emp.telefono IS NOT NULL THEN emp.telefono ELSE 'Ninguno' END) AS
> Telefono,
>
> (CASE WHEN us.fax IS NOT NULL THEN us.fax ELSE 'Ninguno' END) AS Fax,
>
> (CASE WHEN emp.email IS NOT NULL THEN emp.email ELSE 'Ninguno' END) AS
> Email,
>
> (CASE WHEN lic.consec_constancia IS NOT NULL THEN lic.consec_constancia ELSE
> 0 END) AS Constancia,
>
> (case when emp.activo = true then emp.fecha_apertura when emp.activo = false
> then emp.fecha_cierre else emp.fecha_cierre End) AS Fecha,
>
> (case when emp.activo = true then 'Activo' when emp.activo = false then
> tc.descripcion else 'Inactivo' End) AS Estado,
>
> (CASE WHEN lic.num_licencia IS NOT NULL THEN lic.num_licencia ELSE 'Ninguno'
> END) AS NumRegistro
>
> FROM data_empresa.empresa emp INNER JOIN data_empresa.usuario_empresa ue
>
> ON (emp.id_empresa = ue.id_empresa) LEFT JOIN data_usuario.usuario us
>
> ON (us.id_usuario=ue.id_usuario) LEFT JOIN data_empresa.empresa_actividad ea
>
> ON (emp.id_empresa = ea.id_empresa) LEFT JOIN data_proyecto.tipo_actividad
> ta
>
> ON (ea.id_actividad = ta.id_actividad) LEFT JOIN data_empresa.cierre_empresa
> ce
>
> ON (emp.id_empresa = ce.id_empresa) LEFT JOIN data_empresa.tipo_cierre tc
>
> ON (ce.id_tipo_cierre = tc.id ) LEFT JOIN data_empresa.tipo_categoria tca
>
> ON (ea.id_categoria = tca.id_tipo_categoria) LEFT JOIN
> data_empresa.cargos_empresa cemp
>
> ON (ea.id_actividad = cemp.id_actividad ) LEFT JOIN localidad.departamento
> dep
>
> ON (dep.id_dept = emp.departamento) LEFT JOIN localidad.municipio mun
>
> ON (mun.id_dept = emp.departamento AND mun.activo = true) LEFT JOIN
> localidad.distrito dis
>
> ON (dis.id = emp.distrito) LEFT JOIN data_empresa.parametros_empresa paremp
>
> ON (ea.id_actividad = paremp.id_actividad) LEFT JOIN data_empresa.situacion
> s
>
> ON (s.id_situacion = emp.id_situacion) LEFT JOIN licencia.licencias lic
>
> ON (lic.id_empresa = emp.id_empresa) LEFT JOIN licencia.estado_pago ep
>
> ON (ep.id_estado_pago = lic.id_estado_pago)
>
> WHERE ((emp.nombre ILIKE '%%' AND emp.id_situacion ILIKE '%%' ) AND
> ea.principal=false)
>
> GROUP BY emp.nombre, emp.id_empresa, ta.descripcion, tca.descripcion,
> dep.descripcion,
>
> mun.nombre, dis.nombre, emp.direccion, emp.telefono, us.fax, emp.email,
> lic.consec_constancia,
>
> paremp.nombre, emp.fecha_apertura, emp.fecha_cierre, emp.activo,
> tc.descripcion, lic.num_licencia
>
> ORDER BY emp.nombre
>
>
>
> Agradeceré sus sugerencias.
>
>
>
> Saludos,

Lo que te conviene hacer, para no estudiar un explain kilométrico, es
ir cortando y simplificando la consulta hasta encontrar la dificultad.
Por ejemplo, primero quitarle los "cases", luego quitarle los group by, etc.
Los subqueries se pueden probar como una consulta independiente para
ver si tienen peso o no, si aparente no tener un peso significativo,
quitarlo.
De esa forma podés ir achicando el "explain" hasta tener algo manejable.

Es posible también que convenga sacar las descripciones del group by,
para simplificar la "agregación" al final de la recolección de los
datos.

Silvio

--
Silvio Quadri

In response to

Responses

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Jaime Casanova 2009-07-16 19:08:37 Re: Tuning auna consulta
Previous Message Vida Luz Arista 2009-07-16 15:23:47 RE: Tuning auna consulta