FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
|||
|
|||
Vista demasiado lenta!!!
Cordial saludo,
tengo un problema con una vista creada en mi base de datos de interbase, cada vez q la llamo tarda casi 7 minutos en mostrarme los datos , y claro esto no puede ser, así q si alguien tiene una sugerencia de cómo puedo hacer q vaya más rápido ... se lo agradecería muchísimo. La vista es necesaria ya que es requerida para realizar informes a través de Report builder, pensé en generarla a través de un procedimiento almacenado pero RB no permite generar informes desde datos con este origen. La sentencia sql de la vista es la siguiente: CREATE VIEW VER_FRECUENCIAS ( CODOF_VF, CODTRA_VF, TDIAS_VF, TTIEMPO_VF, COSTO_VF, TCOSTO_VF) AS select CodOF_Fot, CodTra_Fot, count(Fecha_Fot) as TDias, Sum(Tiempo_OT) as TTiempo, Costo_Vct, Sum(Tiempo_OT) * Costo_Vct From Frecuencias_Ot Left Outer Join OF_TRabajos On COdOf_Fot = CodOF_OT And CodTra_FOT = CodTra_OT Left outer Join ver_costo_trabajos On CodTra_Fot = CodTra_VCT Group By CodOF_Fot, CodTra_Fot, Tiempo_OT, Costo_Vct ; Como no sé que periodo de fechas me van a insertar no puedo colocar una clausula where para q filtre mucho más los datos, por lo cual los calcula todos y luego desde el informe filtro la tabla, pero tarda la tira en total 331.5 segundos. Gracias de antemano. |
#2
|
||||
|
||||
¿Y si creas la vista en ejecución cuando ya sepas el rango de fechas?
Se puede crear la vista utilizando SQL, por lo tanto en el momento que tengas el rango podrías crearlas modificando el SQL que has añadido al mensaje. A parte de ésto, revisa índices que tengas definidos. ¿Puedes utilizar algun INNER JOIN en lugar de LEFT JOIN? (aceleran bastante..)
__________________
Germán Estévez => Web/Blog Guía de estilo, Guía alternativa Utiliza TAG's en tus mensajes. Contactar con el Clubdelphi P.D: Más tiempo dedicado a la pregunta=Mejores respuestas. |
#3
|
|||
|
|||
Cita:
pero aún me qda un par de dudas, supongo q, lo q me dices, cada vez q vaya a generar el informe debo borrar y crear de nuevo la vista, porq no conozco método q permita modificarlas? y si creo la vista en el momento de tenga el rango, q pasa si son dos o más usuarios los q intentan generar el informe al mismo tiempo? no crearía un conflicto al intentar sobre escribir la consulta del 1er usuario q la llamó? En cuanto a lo de los indicies, si los tengo todos para que permitan una rápida búsqueda y miraré lo del reemplazar los left join por inner join aunq en unos casos creo q no podré cambiarlo ya q puede no tener registros relacionados. Muchas gracias de nuevo. Un saludo. |
#4
|
||||
|
||||
Pues hay que ver sobre cuantos datos está actuando la vista.... pero tantos segundos me parece exagerado.
Verificá que haya indices que permitan una óptima realización de los joins (incluidos los outer joins). En lugar de "filtrar" toda la tabla desde delphi, hace que el Select sobre la vista incluya un predicado... esto será siempre mas óptimo. No conozco Report Builder, pero digo yo que nada impide que calcules todo desde un storedproc... puesto que lo podes utilizar en una sentencia sql como si se tratase de una tabla o una vista:
Hasta luego.
__________________
Juan Antonio Castillo Hernández (jachguate) Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate |
#5
|
|||
|
|||
Hola, gracias por responder,
pero como te digo el Report builder solo permite hacer informes sobre las tablas y vistas de la base de datos, no de un Dataset de delphi. Gracias de todas formas. |
#6
|
||||
|
||||
¿Y no podes entrar una sentencia SQL cualquiera?... no lo creo!
__________________
Juan Antonio Castillo Hernández (jachguate) Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate |
#7
|
||||
|
||||
Primero, deberías revisar bien los indices de las tablas TRabajos y ver_costo_trabajos como dice Jachguate, luego no se si esto te servirá:
Código:
CREATE VIEW VER_FRECUENCIAS ( CODOF_VF, CODTRA_VF, FECHA_VF, TIEMPO_VF, COSTO_VF, TCOSTO_VF) AS select CodOF_Fot, CodTra_Fot, Fecha_Fot, Tiempo_OT, Costo_Vct,Tiempo_OT * Costo_Vct From Frecuencias_Ot Left Outer Join OF_TRabajos On COdOf_Fot = CodOF_OT And CodTra_FOT = CodTra_OT Left outer Join ver_costo_trabajos On CodTra_Fot = CodTra_VCT Código:
SELECT CODOF_VF,CODTRA_VF,COUNT(FECHA_VF) AS TDIAS_TF,SUM(TIEMPO_VF) AS TTIEMPO_VF,COSTO_VF,TCOSTO_VF,SUM(COSTO_VF,TCOSTO_VF) AS GCOSTO_VF FROM VER_FRECUENCIAS WHERE FECHA_VF ..... GROUP BY CODOF_VF,CODTRA_VF,COSTO_VF,TCOSTO_VF Saludos, Jorge. |
#8
|
|||
|
|||
Gracias chicos,
he modificado la consulta cambiando el left join por inner join, además he creado algunos otros indices. Aún así espero la respuesta sobre como crear la consulta y q esto no cause conflicto si alguien intenta generar otro informe en base a dicha consulta, lo digo porq si fuese solo enviar a implimir no creo q haya concurrencia pero si se qdan mirando el preview si puede darse. De nuevo muchas gracias. |
|
|
|