Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General »

Rendimiento de una consulta desde un programa

Estas en el tema de Rendimiento de una consulta desde un programa en el foro de Bases de Datos General en Foros del Web. Tengo un informe que se basa en una función de base de datos. Para mí es la forma más cómoda de hacer consultas "parametrizadas". La ...
  #1 (permalink)  
Antiguo 21/05/2004, 01:26
 
Fecha de Ingreso: julio-2003
Mensajes: 120
Antigüedad: 20 años, 9 meses
Puntos: 0
Rendimiento de una consulta desde un programa

Tengo un informe que se basa en una función de base de datos. Para mí es la forma más cómoda de hacer consultas "parametrizadas". La consulta que le da datos es bastante "pesada" y tiene un cursor. Cuando la ejecuto en el "Analizador de consultas de SQLServer" tarda unos 10 segundos en devolver todos los registros, lo q considero un tiempo razonable porque hace un resumen de casi toda la base de datos.
Mi problema es que, el llamar a la misma función desde un programa (Visual Basic - sobre un recordset que luego se pasa a un informe de Crystal Report), el tiempo de respuesta se multiplica. Llega a tardar 3 minutos, y a veces más, la misma consulta que en analizador se resuelve en 10 segundos. Dentro de SQLServer, el proceso aparece dentro de "Administración - Actividad Actual - Bloqueos" (tanto de proceso como de objeto).
¿Alguien me podría dar alguna pista sobre esta diferencia de rendimiento entre un proceso llamado desde SQLServer y desde un programa? (No es problema del informe; la diferencia de tiempo se da ya al intentar llenar un recordset a partir de la consulta, antes de asignarlo al informe).
¿Hay alguna forma de resolverlo?
Gracias de antemano
  #2 (permalink)  
Antiguo 21/05/2004, 16:47
 
Fecha de Ingreso: julio-2003
Mensajes: 120
Antigüedad: 20 años, 9 meses
Puntos: 0
Quisiera apuntar una cosa más.
Hemos reiniciado el servidor, y la consulta, también desde la aplicación, vuelve a tardar pocos segundos. Ocurre en algún momento, con el paso de los días, que el informe empieza a demorarse mucho.
La ventana de "Actividad" de SQLServer me da que no es muy exhaustiva. ¿Sería de más utilidad el analizador -si supiera usarlo- para ver q es lo q se queda atascado?
  #3 (permalink)  
Antiguo 22/05/2004, 13:43
 
Fecha de Ingreso: octubre-2003
Ubicación: Hermosillo, Sonora
Mensajes: 75
Antigüedad: 20 años, 7 meses
Puntos: 0
Tendrías que anañizar bien tu query, si tienes funciones aplicando a los campos o a los filtros lo cual hace tardada la consulta, y mas si estan combinando mas de dos tablas.
Si es una simple consulta a una o varias tablas, entonces asignale a las tablas indices, a los campos que requieran y has uso del indice correspondiente a la cada tabla, no se si me exploco bien.
Por ejemplo, si tienes dos tablas una de maestros y otra de alumnos, y haces una consulta de ellas uniéndolas por id de maestro para cada tabla, con la de maestros no es problema porque su clave sería su Id, la de alumnos su clave sería su Id pero se requiere indexado el idMaestro que es la relación que tiene con la tabla de maestros, para esto a la tabla de alumnos se le agrega un Idex del campo IdMaestro, y en la consulta ...alumnos with nombre_indice.... para que se agilice la consulta.

Si quieres, dime como va tu query y te ayudo a analizarla.
  #4 (permalink)  
Antiguo 23/05/2004, 03:16
 
Fecha de Ingreso: julio-2003
Mensajes: 120
Antigüedad: 20 años, 9 meses
Puntos: 0
Hola TeresitaHP
Nosotros tb usamos un Id único en todas las tablas y las relaciones las basamos sobre ese campo. Esos campos siempre son claves y además tenemos bastantes índices.
La consulta de mis quebraderos de cabeza es realmente muy "pesada"; tiene varios cursores y es normal que tarde, pero lo q me "mosquea" es q desde SQLServer siempre tarde más o menos 10 segundos mientras q desde un programa Visual Basic o un informe sean 3, 4 o más minutos. Sobre todo pq, si reiniciamos el servidor, el informe, desde los programas, tarda esos 10 segundos, pero con el paso de los días va tardando cada vez más -desde los programas, desde SQLServer siempre esos 10 segundos-, como si en el servidor quedaran recursos "colgados" (aunq ni la actividad de la CPU ni la memoria muestren nada raro).
Si quieres mañana envío la query. Hoy no puedo pq es domingo y la tengo en el trabajo.
Gracias por tu interés
  #5 (permalink)  
Antiguo 24/05/2004, 16:50
 
Fecha de Ingreso: octubre-2003
Ubicación: Hermosillo, Sonora
Mensajes: 75
Antigüedad: 20 años, 7 meses
Puntos: 0
A pues por ahi hubieras empezado, es muy importante que termines los objetos que se crean en una aplicación, todas las conexiones hay que cerrarlas (.close) y hay que terminar lasvariables (Set conexión = nothing) para que no se queden en el limbo, al igual con los recordset, cerrarlos (.close) y terminar las variables (Set rsTabla = Nothing). Y así con todos los objetos que utilices para cosas pesadas.
  #6 (permalink)  
Antiguo 26/05/2004, 10:56
 
Fecha de Ingreso: julio-2003
Mensajes: 120
Antigüedad: 20 años, 9 meses
Puntos: 0
Generalmente lo hago siempre, pero es verdad q debería dar un buen repaso a algunas pantallas. En principio se supone q, por ejemplo, aunq no destruyas un recordset q declaras dentro de una función, se destruye solo cuando la función se termina de ejecutar, pero puede q hayamos confiado demasiado en eso.
De todas formas sigue habiendo cosas q no me cuadran, por ejemplo q otros informes q no son mucho más sencillos q este, se ejecuten con normalidad cuando el q da problemas ya tarda lo q no está escrito. Debe haber algo entre el ADO y SQLServer q no soy capaz de ver y ni siquiera sé si se podrá controlar programando "a alto nivel".
Un saludo.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 10:23.