Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > SQL
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 13-12-2009
martinchooozzz martinchooozzz is offline
Miembro
 
Registrado: sep 2006
Posts: 21
Poder: 0
martinchooozzz Va por buen camino
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....
Responder Con Cita
  #2  
Antiguo 13-12-2009
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.038
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
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.
Responder Con Cita
  #3  
Antiguo 13-12-2009
[coso] coso is offline
Miembro Premium
 
Registrado: may 2008
Ubicación: Girona
Posts: 1.678
Poder: 0
coso Va por buen camino
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.
Responder Con Cita
  #4  
Antiguo 14-12-2009
Avatar de rgstuamigo
rgstuamigo rgstuamigo is offline
Miembro
 
Registrado: jul 2008
Ubicación: Santa Cruz de la Sierra-Bolivia
Posts: 1.646
Poder: 17
rgstuamigo Va por buen camino
Arrow

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.
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...
__________________
"Pedid, y se os dará; buscad, y hallaréis; llamad, y se os abrirá." Mt.7:7
Responder Con Cita
  #5  
Antiguo 15-12-2009
Avatar de Axel_Tech
Axel_Tech Axel_Tech is offline
Miembro
 
Registrado: nov 2008
Ubicación: lugar en que está ubicado algo.
Posts: 85
Poder: 16
Axel_Tech Va por buen camino
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)
__________________
No hope, no dreams, no love, my only escape is Underground
Responder Con Cita
  #6  
Antiguo 15-12-2009
martinchooozzz martinchooozzz is offline
Miembro
 
Registrado: sep 2006
Posts: 21
Poder: 0
martinchooozzz Va por buen camino
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.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
optimizar codigo acrophet Varios 5 16-01-2011 23:28:39
Optimizar con Case XXX of TIKIMORE Varios 9 10-07-2010 17:21:20
Optimizar Consulta - algoritmo jmartinez MySQL 2 28-08-2007 17:06:37
Optimizar Consulta en Firebird AGAG4 Firebird e Interbase 14 10-01-2006 02:11:30
Optimizar Consulta dunia_lv MS SQL Server 2 21-04-2005 09:43:51


La franja horaria es GMT +2. Ahora son las 10:30:31.


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
Copyright 1996-2007 Club Delphi