Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > Firebird e Interbase
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 02-06-2005
Hotmago Hotmago is offline
Registrado
 
Registrado: jun 2005
Posts: 5
Poder: 0
Hotmago Va por buen camino
Unhappy 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.
Responder Con Cita
  #2  
Antiguo 02-06-2005
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.282
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
¿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.
Responder Con Cita
  #3  
Antiguo 02-06-2005
Hotmago Hotmago is offline
Registrado
 
Registrado: jun 2005
Posts: 5
Poder: 0
Hotmago Va por buen camino
Lightbulb

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.
Responder Con Cita
  #4  
Antiguo 02-06-2005
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 28
jachguate Va por buen camino
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.

__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
  #5  
Antiguo 02-06-2005
Hotmago Hotmago is offline
Registrado
 
Registrado: jun 2005
Posts: 5
Poder: 0
Hotmago Va por buen camino
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.
Responder Con Cita
  #6  
Antiguo 02-06-2005
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 28
jachguate Va por buen camino
Cool

¿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
Responder Con Cita
  #7  
Antiguo 02-06-2005
Avatar de jwmoreira
jwmoreira jwmoreira is offline
Miembro
 
Registrado: jun 2004
Posts: 83
Poder: 20
jwmoreira Va por buen camino
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.
Responder Con Cita
  #8  
Antiguo 03-06-2005
Hotmago Hotmago is offline
Registrado
 
Registrado: jun 2005
Posts: 5
Poder: 0
Hotmago Va por buen camino
Thumbs up

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


La franja horaria es GMT +2. Ahora son las 14:03:45.


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