![]() |
![]() |
![]() |
![]() |
![]() |
FTP | ![]() |
![]() |
CCD | ![]() |
![]() |
Buscar | ![]() |
![]() |
Trucos | ![]() |
![]() |
Trabajo | ![]() |
![]() |
Foros | ![]() |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
![]() |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
||||
|
||||
Optimizar Consulta en Firebird
Tengo un problema con una consulta en Firebird 1.52, tarda como 10 a 15 mins en generarmela y tengo en la tabla sólo 60,000 registros, el objetivo es de extraer aquellos clientes que han dejado de comprar en cierta sucursal en los últimos 4 meses, muestro la sentencia sql:
*Tengo como PK los campos Sucursal+Cliente+Ano+Mes todos son de tipo Integer. Realice varias pruebas entre ellas separar el Subselect y ejecutarlo por separado y se ejecutan al instante, pero por lo que veo si son 60,000 registros obviamente realiza 60,000 busquedas en el subselect es por eso el motivo de que tarda una eternidad, en la pc donde hago pruebas es una P4 con 256 MB en RAM y 20GB en Disco Duro, con WinXP Professional SPII. Alguna sugerencia de optimizarla, se los agradecería muchisimo. Última edición por AGAG4 fecha: 01-11-2005 a las 18:06:42. Razón: Corrección |
#2
|
||||
|
||||
Asi a ojo, y sin tener las tablas para checar te daría estas sugerencias, trata con esta sentencia modificada:
Quita la relacion del subselect con la consulta principal para que esta se ejecute una sola vez, y asi creo que el optimizador interno el va a susutituir la sentencia in por un exists...al hacer la subconsulta única sin necesidad de iterarla en cada renglon de la consulta primaria debe hacerlo por lo menos un poco mas rápido... No se si poniendo el sum que tienes en el order by en el select tambien ganes algo...
__________________
"Lo mejor de no saber hacer nada es que se tiene mucho tiempo libre."
|
#3
|
||||
|
||||
Nop
Gracias lpmlpm pero no funciono sigue igual no baja de 10 mins. no me quiero imaginar cuando sean 500,000 registros, pero bueno le sigo investigando....
Saludos.... Última edición por AGAG4 fecha: 02-11-2005 a las 00:46:16. Razón: Corrección |
#4
|
||||
|
||||
Usás índices?
mejoran mucho la velocidad
__________________
And I'd like an hour on the holodeck with Seven of Nine. |
#5
|
||||
|
||||
¿Puedes pasarnos el metadata de la estructura de la base de datos?, así podemos hacer pruebas nosotros.
__________________
La otra guía de estilo | Búsquedas avanzadas | Etiquetas para código | Colabora mediante Paypal |
#6
|
||||
|
||||
Hola.
Bueno sin saber como está estructurada la BD te diria que: si solo te interesa saber si ha comprado o no, mira a ver si puedes agrupar por cliente en la subconsulta. Te evitarás así un monton de registros. saludos |
#7
|
||||
|
||||
que tal si probas con:
No lo he comprobado, pero debiera mostrarte todos aquellos clientes que no han comprado desde el 1/6/2005. Hasta luego. ![]()
__________________
Juan Antonio Castillo Hernández (jachguate) Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate |
#8
|
||||
|
||||
ok
Si tengo 1 indice por Sucursal+Cliente+Ano+Mes, tome estos campos por ser los que dependen después de la instrucción WHERE de los Select's, pero no aumento mucho la velocidad, voy a probar como me comenta jachguate .
Muchas Gracias.... Última edición por AGAG4 fecha: 04-11-2005 a las 02:47:46. Razón: Corrección |
#9
|
||||
|
||||
????
Disculpe la tardanza para verificar las pruebas, revise el Select usando Having funciono Bien, pero tengo el problema de que me obliga agrupar por FECHA y me pone 1 mismo cliente varias veces, por lo que lo que yo quiero es agrupar Sólo por clientes, pero si quito dentro del select el Max(c.fecha) no me serviría el having.
Otra cosa que me di cuenta, si pongo lo siguiente: No me hace el Ordenamiento Descendente, me pone registros revueltos, Ejemplo: Importe 1200 1000 800 5000 40000 .... Gracias por su sugerencia. Última edición por AGAG4 fecha: 04-01-2006 a las 17:32:01. |
#10
|
||||
|
||||
Hola.
Pues entonces agrega la condicion de la fecha en la clausula WHERE Saludos |
#11
|
||||
|
||||
????
No puedo agregar dentro del where max(fecha)<'01.08.2005' por si no haz leido quiero aquellos clientes que dejaron de comprar en determinada fecha.
ó Si agrego fecha <='01.08.2005' me obliga a poner un Subselect como arriba lo menciono. Gracias por su respuesta. |
#12
|
||||
|
||||
Hola.
No se si entiendo bien lo que dices. Yo me referia a esto.
Saludos |
#13
|
||||
|
||||
????
A como explicas sólo formas un Grupo de clientes que compraron de Enero a Mayo, pero te falta agregar los clientes que compraron de Junio a Diciembre y Sacar el Grupo Final que Compraron de Enero a Mayo pero que NO ESTEN en el Grupo Junio a Diciembre.
No me sirve saber aquellos clientes que SOLO compraron de Enero a Julio. Espero haberme explicado. Saludos.... |
#14
|
||||
|
||||
Resuelto....
Hasta ahorita me di cuenta que el Having no es dependiente del Group By por lo tanto quite dentro del Select, Max(c.Fecha) y ya me dio los datos correctos.
Gracias a todos.... Feliz Año 2006. |
#15
|
||||
|
||||
Lamento entrar hasta ahora y darme cuenta de esto, que ya estaba implicito en la respuesta que te dí hace varios días. Me alegro que todo saliera bien
![]()
__________________
Juan Antonio Castillo Hernández (jachguate) Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate |
![]() |
|
|
![]() |
|