Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   optimizar consulta (https://www.clubdelphi.com/foros/showthread.php?t=65417)

martinchooozzz 13-12-2009 01:16:03

optimizar consulta
 
buenas gente tengo una consulta para mysql la cual me demora mucho tiempo creo por la cantidad de registros que manejo no deberia tardar tanto pienso tal vez puedan corregirme. la consuta es la siguiente

Código SQL [-]
select * from creditos where idcredito in 
(select idcredito from cuotascreditos where idestadocuota in(4,7) 
group by idcredito having count(*)  >=  3)

demora unos 9 segundos pero solo tengo 340 creditos.
lo que tiene que devolver mi consulta es los creditos que tienen mas de 3 cuotas adeudadas

cualquier ayuda se agradece saludos....

Casimiro Notevi 13-12-2009 11:23:43

Es muy difícil ayudarte si no tenemos la estructura de las tablas. Para empezar, como mínimo, deberías quitar ese asterisco del "select *" y sustituirlo por los campos que realmente necesites. También puedes usar programas que te analizan el tiempo que tarda en hacer cada cosa, no conozco ninguno en mysql, pero seguro que los hay.
También puedes ir probando "trozo a trozo" para intentar encontrar al culpable, por ejemplo, primero pruebas sin el group by, luego pruebas sin el having, luego pruebas sólo con el select anidado, etc. y así también puede que encuentres al culpable.

coso 13-12-2009 18:39:51

Hola,

Código Delphi [-]
select * from creditos where idcredito in 
(select idcredito from cuotascreditos where idestadocuota in(4,7) 
group by idcredito having count(*)  >=  3)

El select anidado te agrupa toda la tabla cada vez que se llama, por cada registro en creditos. Creo que para optimizarlo lo mejor seria crear una tabla temporal desde cuotascredito, con el filtro de idestadocuota y de aquellos con count >= 3. Luego llamar a otro select comparando si idcreditos de creditos esta en esta tabla temporal, y finalmente haciendo drop a esta tabla temporal. Así tansolo harás la agrupacion y el filtro por idestadocuota una única vez, en vez de las 340 que estas haciendo ahora. Saludos.

rgstuamigo 14-12-2009 14:41:32

Aunque no concosco muy bien tu estructura de tus tablas puedo decirte que talves esta parte
Código SQL [-]
 group by idcredito having count(*)  >=  3)
es la que esta haciendo tardar mucho.:rolleyes:;)
Haber prueba asi:
Código SQL [-]
select * from creditos where idcredito in
(select idcredito from cuotascreditos cc
  where idestadocuota in(4,7) and
 (select count(*) from cuotascreditos aux where aux.idcredito=cc.idcredito)>=3);
Saludos...:)

Axel_Tech 15-12-2009 10:08:08

También puedes sustituir el primer IN por un EXISTS, que funciona mucho más rápido:
Código SQL [-]
select * from creditos A where exists
(select idcredito from cuotascreditos B
where idestadocuota in(4,7) and A.idcredito=B.idcredito
group by idcredito having count(*) >= 3)

martinchooozzz 15-12-2009 18:11:42

Solucionado
 
gracias a todos por responder muchachos.
Axel_Tech tu codigo me trae lo que nesecito instantaneamente sin nada de demora muchas gracias.
rgstuamigo tu consulta me trae todos los creditos pero como dije quedo solucionado con el codigo de axel.

gracias gente saludos.


La franja horaria es GMT +2. Ahora son las 06:59:46.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi