2009/7/15 Vida Luz Arista <vida.ari...@ideay.net.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. >
Podrias indicar cual es el explain analyze de la consulta para ayudarte mejor.. nos vemos > > > 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, -- TIP 5: ¿Has leído nuestro extenso FAQ? http://www.postgresql.org/docs/faqs.FAQ.html