Hola!

Registrándote como bakuno podrás publicar, compartir y comunicarte en privado con otros bakuos :D

Regístrame ya!

ayuda con una consulta

  • Autor de tema Autor de tema kuTgo
  • Fecha de inicio Fecha de inicio

kuTgo

Bovino maduro
Desde
15 Ago 2007
Mensajes
274
que tal bakunos :eolo: pues aqui exponiendo una bronca la cual no logro arreglar :chommy:la onda es que realizo dos consultas para obtener datos de ahorro y prestamo de una cuenta entonces como algunas cuentas no tienen prestamos o ahorro uso outer join para que asi tenga el mismo numero de rows y poder mostrarla sin problema pero la onda esta en que mi consulta de ahorro tarda aprox 60s!:comillas: y no logro dar por que o de que manera optimizarla , ya que la de prestamos es muy parecida y solo tarda 0.6s :¬¬:
aqui se las dejo y espero comentarios gracias:punzadita:

préstamos

select a.numerocuenta, sum(p.SaldoMonto + p.SaldoInteres ) as ahorro from jos_fh_prestamos p right outer join jos_fh_cuenta_asociado a
on a.numerocuenta=p.numerocuenta and p.fechaprimerpago >= (SELECT min(f.FechaInicio) FROM jos_fh_fechas_corte as f where published=0) AND p.Fechaprimerpago <=(SELECT max(f.FechaFin) FROM jos_fh_fechas_corte as f where published=0)
where a.id_empresa=1
group by numerocuenta
order by numerocuenta

ahorros

select a.numerocuenta, sum(c.fondoahorro) as ahorro from jos_fh_ahorros c right outer join jos_fh_cuenta_asociado a
on a.numerocuenta=c.numerocuenta and c.estado=0
where a.id_empresa=1 and a.numerocuenta=c.numerocuenta
group by a.numerocuenta
order by a.numerocuenta

cabe mencionar que trabajo solo con tres tablas Ahorro, prestamos, cuenta_asociados las cuales relaciono con el registro numerocuenta
 
Edito, yo reescribiría la consulta de la siguiente manera:

select a.numerocuenta, sum(c.fondoahorro) as ahorro from jos_fh_ahorros c right outer join jos_fh_cuenta_asociado a
on a.numerocuenta=c.numerocuenta
where a.id_empresa=1 and c.estado=0
group by a.numerocuenta
order by a.numerocuenta

La comparación que se hace de a.numerocuenta=c.numerocuenta en la 3ra linea de la consulta original es innecesaria, ya que dicha comparación ya esta especificada en el right outer join.


Me llama la atención el uso de id_empresa, parece una llave primaria, pero numerocuenta también parece una llave primaria, ambas para la tabla de asociados. Si tienes información revuelta de empresas y sus respectivos asociados, en ese caso te sugeriría que normalices mas esta tabla hasta que obtengas dos tablas, una para empresa con una relación de uno a muchos para la tabla de asociados.

De cualquier manera para optimizar:
compara constantes y números primero
las comparaciones entre registros hazlas de la tabla de menor número de registros a la tabla de mayor número de registros (es preferible entre una tabla de un registro y una de mil registros, hacer un solo acceso a la tabla de mil registros, que mil accesos a la tabla de un registro).
Los join implícitos(=) o explícitos, son la sentencia mas lenta de sql, no abuses de ellos.
Utiliza índices asociados a las tablas.
Utiliza el explain para determinar en que manera son accesadas las tablas, si hay un full scan estas haciendo las cosas mal.

Si esto no te ayuda,
¿Podrías mostrar tu diseño de la bd?
¿En que RDBMS estas trabajando?
Con esta información quizá te pueda ayudar de mejor manera.

Saludos
 
hola Salandrews gracias por tu respuesta tienes razon sobre la linea 3 esque estaba intentando cualquier cosa a ver si funcionaba xD

esta es la que original :

select a.numerocuenta, sum(c.fondoahorro) as ahorro from jos_fh_ahorros c right outer join jos_fh_cuenta_asociado a
on a.numerocuenta=c.numerocuenta and c.estado=0
where a.id_empresa=1
group by a.numerocuenta
order by a.numerocuenta

y no puedo usar where a.id_empresa=1 and c.estado=0
por que asi mi consulta no daria los valores null que necesito y en efecto creo que no esta bien normalizada la base de datos, pero la onda es que yo no la hize estoy trabajando en un proyecto donde ya va la tercera etapa y esto que estoy haciendo es de un modulo que no les quedo bien:tomate: haz de cuenta que es un sistema que es un componente para joomla! y estoy usando xampp


las tablas son

ahorros
id_Ahorro id_Asociado NumeroCuenta id_fechacorte Periodos TotalAportacion FondoAhorro CuotaAhorro id_Plan FechaRegistro Estado Sueldo id_Empresa

cuenta asociado
id_Empresa id_CuentaAsociado id_Asociado NumeroCuenta FechaCreacion MontoBalance
 
Al principio creí que era por esa 3ra línea que se tardaba, pero por lo visto no.

Quizá puedas probar ejecutar la consulta desde lo mas básico y poco a poco agregarle las condiciones, para determinar en que comparación es que se vuelve lenta:

select a.numerocuenta, sum(c.fondoahorro) as ahorro from jos_fh_ahorros c right outer join jos_fh_cuenta_asociado a
on a.numerocuenta=c.numerocuenta
group by a.numerocuenta

Y a partir de aquí agregar las demás condiciones y comparaciones. Si en esta consulta base ya se tarda, podrías crear indices para estas tablas.

Deberías probarlas también directamente en mysql, para asegurarte que la programación del módulo no esta afectando la recuperación de información por parte de la consulta.

Espero te pueda ayudar y si lo logras resolver, cuéntanos como lo hiciste, siempre es útil.

Saludos y suerte
 
que tal salandrews, en efecto realizaba las consultas directamente a la base de datos, y como lo mencionas solo agregue un índice al campo numerocuenta de la tabla de ahorros y funcionó muchisimo mas rápido, de 60s a .006s, fue un gran cambio ya que no encontre otra forma de realizar la consulta ya que cualquier modificación cmbiaba los datos que me mostraba y no me serbia. saludos
 
Volver
Arriba