Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   Vista demasiado lenta!!! (https://www.clubdelphi.com/foros/showthread.php?t=21969)

Hotmago 02-06-2005 13:57:05

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.

Neftali [Germán.Estévez] 02-06-2005 14:09:52

¿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..)

Hotmago 02-06-2005 16:02:29

Cita:

Empezado por Neftali
¿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..)

Gracias Neftalipor tu pronta respuesta,

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. :D

jachguate 02-06-2005 16:38:29

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:

Código SQL [-]
Select *
  from StoredProc(Parametros);

Hasta luego.

;)

Hotmago 02-06-2005 16:45:06

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.

jachguate 02-06-2005 16:48:26

¿Y no podes entrar una sentencia SQL cualquiera?... no lo creo!

jwmoreira 02-06-2005 20:22:22

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

Luego en el select agrupa lo que necesites con el respectivo where:
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

Espero te ayude.

Saludos,
Jorge.

Hotmago 03-06-2005 10:08:52

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.:p


La franja horaria es GMT +2. Ahora son las 16:50:59.

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