¿A qué se debe este mensaje de error?

09/02/2004 - 16:23 por Eje | Informe spam
Algunas veces en un procedimiento almacenado recibo este mensaje de error:

Servidor: mensaje 845, nivel 17, estado 1, línea 1
Se excedió el tiempo de espera del tipo de pestillo del búfer 2 para la
página (1:1610435), Id. de base de datos 5.

El procedimiento aún así termina sin errores, puesto que al final de él
tengo un mensaje de información y este aparece tras el mensaje de error, con
toda normalidad.
El procedimiento llena un cursor con unos datos y por cada fila del cursor
realiza una serie de cálculos haciendo consultas en varias tablas y grabando
el resultado de cada cálculo en una tabla temporal que después vuelca en una
tabla real de la BD. Dado que tengo mensajes de error antes de llenar el
cursor y antes de terminar, y que el mensaje de error sale entre ambos,
deduzco que el mensaje debe dar en el proceso de cada línea del cursor, al
grabar en la tabla temporal o al grabar la tabla temporal en la tabla real.
Ya digo que el error no sale siempre, además es un procedimiento que tarda
aprox. 8 horas y el error aparece cuando termina, con lo cual no puedo hacer
pruebas rápidas para ver por qué da y arreglaro.
A ver si alguien puede darme alguna pista de por qué ocurre esto.

Un saludo

Preguntas similare

Leer las respuestas

#1 Maximiliano D. A.
09/02/2004 - 16:31 | Informe spam
te copio lo que dice el mismo manual sobre dicho error

Error 845
Nivel de gravedad 17
Texto del mensaje
Se excedió el tiempo de espera del tipo de pestillo del búfer %1! para la
página %2!, Id. de base de datos %3!.

Explicación
Cuando el sistema soporta condiciones de una gran carga o se producen
numerosas operaciones de E/S, puede producirse este mensaje.

Acción
Normalmente, se puede pasar por alto este mensaje; sin embargo, si recibe
varios mensajes a la vez que el tiempo de espera aumenta, puede indicar un
problema interno del servidor. Póngase en contacto con el administrador del
sistema. El administrador del sistema debe comprobar las columnas waittype,
waittime, lastwaittype y waitresource de sysprocesses para ver las
actividades que está realizando cada SPID.


pd: me preocupa el trabajo con esos cursores y sobre todo el tiempo que
tarda, quizas lo debamos ver con mayor informacion

Salu2

Maximiliano Damian Accotto


"Eje" escribió en el mensaje
news:c088il$13qj2n$
Algunas veces en un procedimiento almacenado recibo este mensaje de error:

Servidor: mensaje 845, nivel 17, estado 1, línea 1
Se excedió el tiempo de espera del tipo de pestillo del búfer 2 para la
página (1:1610435), Id. de base de datos 5.

El procedimiento aún así termina sin errores, puesto que al final de él
tengo un mensaje de información y este aparece tras el mensaje de error,


con
toda normalidad.
El procedimiento llena un cursor con unos datos y por cada fila del cursor
realiza una serie de cálculos haciendo consultas en varias tablas y


grabando
el resultado de cada cálculo en una tabla temporal que después vuelca en


una
tabla real de la BD. Dado que tengo mensajes de error antes de llenar el
cursor y antes de terminar, y que el mensaje de error sale entre ambos,
deduzco que el mensaje debe dar en el proceso de cada línea del cursor, al
grabar en la tabla temporal o al grabar la tabla temporal en la tabla


real.
Ya digo que el error no sale siempre, además es un procedimiento que tarda
aprox. 8 horas y el error aparece cuando termina, con lo cual no puedo


hacer
pruebas rápidas para ver por qué da y arreglaro.
A ver si alguien puede darme alguna pista de por qué ocurre esto.

Un saludo


Respuesta Responder a este mensaje
#2 Eje
09/02/2004 - 17:53 | Informe spam
Maximiliano D. A.

pd: me preocupa el trabajo con esos cursores y sobre todo el tiempo que
tarda, quizas lo debamos ver con mayor informacion



Gracias por la información, te comento un poco cómo funciona el
procedimiento:
- Se calculan las fechas del periodo de cálculo a procesar.
- Se crea una tabla temporal para ir almacenando los resultados.
- Se rellena un cursor con los datos de dos tablas (con un UNION) con los
registros que han tenido movimientos en ese periodo y que, por lo tanto, hay
que calcular.
- Por cada registro del cursor se realizan una serie de selects simples a
otras tablas (15 en total), buscando registros por los valores que tienen lo
campos del cursor (todos estos campos están indexados en las tablas en las
que se busca). Estas selects devuelven, cada una, una cantidad numérica. Con
todas esas cantidades se efectuarán los cálculos (muy simples, sumas y
restas), grabándose el resultado en la tabla temporal.
- Tras procesar todos los registros del cursor se inserta todo el contenido
de la tabla temporal en la tabla real de la BD y se elimina la tabla
temporal.

La duración de todo el proceso hoy mismo, con los índices en perfecto estado
y el servidor prácticamente sin nada más en ejecución ha sido de poco más de
7 horas, habiendo procesado cerca de 320.000 filas en total.
Aunque son 17 selects sólo acceden a datos de 5 tablas. Estas tablas son
grandes (2 tablas con cerca de 23 millones de filas y las otras 3 entre 1 y
2 millones) pero como he dicho, tienen índices creados en todos los campos
por los que se accede.
Ya digo que lo extraño es que esto no ocurre siempre, y normalmente las
condiciones de ejecución son siempre las mismas.
Espero que fuera lo que pedías.

Un saludo
Respuesta Responder a este mensaje
#3 Maximiliano D. A.
09/02/2004 - 18:21 | Informe spam
Eje, gracias por lo claro, no es que discutia sobre el error sino que ademas
de la data que te pase, queria saber porque usas Cursores?, el uso de los
mismos pueden poner la cosa muy lenta de verdad, no se que Hard tenes pero
7hs para lo que me estas comentando es un numero, yo creo que si revisas
bien quizas puedas hacer todo sin el cursor cosa que aceleraria enormemente
la performance de ese proceso, Claro hay veces que no hay otra que usar
cursores pero te cuento que son las menos posibles.

Quizas el sacar el uso de cursores no solucione el problema en si (por lo
cual te pase la data), lo que si hara es que ese proceso corra mucho mas
rapido con todas las ventajas que ello tiene no?.

Si no te animas a ver como convertir lo que usas a algo sin cursores,
podrias empezar a postiarnos codigo script y que deseas resolver y aca entre
todos te daremos una mano seguramente.

Salu2

Maximiliano Damian Accotto


"Eje" escribió en el mensaje
news:c08dr8$13u1iu$
Maximiliano D. A.
>
> pd: me preocupa el trabajo con esos cursores y sobre todo el tiempo que
> tarda, quizas lo debamos ver con mayor informacion

Gracias por la información, te comento un poco cómo funciona el
procedimiento:
- Se calculan las fechas del periodo de cálculo a procesar.
- Se crea una tabla temporal para ir almacenando los resultados.
- Se rellena un cursor con los datos de dos tablas (con un UNION) con los
registros que han tenido movimientos en ese periodo y que, por lo tanto,


hay
que calcular.
- Por cada registro del cursor se realizan una serie de selects simples a
otras tablas (15 en total), buscando registros por los valores que tienen


lo
campos del cursor (todos estos campos están indexados en las tablas en las
que se busca). Estas selects devuelven, cada una, una cantidad numérica.


Con
todas esas cantidades se efectuarán los cálculos (muy simples, sumas y
restas), grabándose el resultado en la tabla temporal.
- Tras procesar todos los registros del cursor se inserta todo el


contenido
de la tabla temporal en la tabla real de la BD y se elimina la tabla
temporal.

La duración de todo el proceso hoy mismo, con los índices en perfecto


estado
y el servidor prácticamente sin nada más en ejecución ha sido de poco más


de
7 horas, habiendo procesado cerca de 320.000 filas en total.
Aunque son 17 selects sólo acceden a datos de 5 tablas. Estas tablas son
grandes (2 tablas con cerca de 23 millones de filas y las otras 3 entre 1


y
2 millones) pero como he dicho, tienen índices creados en todos los campos
por los que se accede.
Ya digo que lo extraño es que esto no ocurre siempre, y normalmente las
condiciones de ejecución son siempre las mismas.
Espero que fuera lo que pedías.

Un saludo


Respuesta Responder a este mensaje
#4 Adrian D. Garcia
10/02/2004 - 01:24 | Informe spam
7 hs????
Por lo que realiza el proceso no deberia tardar mas de 20 minutos

1) El calculo de fechas se puede resolver con un SELECT simple?
2) No se puede resolver con JOINS la consultas a las 15 tablas? Creo que si
3) Si hay varios casos de calculos se podria generar una tabla temporal de
movimientos con el UNION y los JOINS de las demas tablas, luego si hay
varios casos de calculos diferentes se podria hacer varias instrucciones de
UPDATE o INSERT diferentes en la tabla de resultado.
4) El traspaso de informacion de la tabla temporal a la tabla real tambien
creo que se podria hacer con una instruccion de INSERT SELECT o UPDATE.


Saludos
Adrian D. Garcia
MCSD
NDSoft Consultoria y Desarrollo

"Eje" wrote in message
news:c08dr8$13u1iu$
Maximiliano D. A.
>
> pd: me preocupa el trabajo con esos cursores y sobre todo el tiempo que
> tarda, quizas lo debamos ver con mayor informacion

Gracias por la información, te comento un poco cómo funciona el
procedimiento:
- Se calculan las fechas del periodo de cálculo a procesar.
- Se crea una tabla temporal para ir almacenando los resultados.
- Se rellena un cursor con los datos de dos tablas (con un UNION) con los
registros que han tenido movimientos en ese periodo y que, por lo tanto,


hay
que calcular.
- Por cada registro del cursor se realizan una serie de selects simples a
otras tablas (15 en total), buscando registros por los valores que tienen


lo
campos del cursor (todos estos campos están indexados en las tablas en las
que se busca). Estas selects devuelven, cada una, una cantidad numérica.


Con
todas esas cantidades se efectuarán los cálculos (muy simples, sumas y
restas), grabándose el resultado en la tabla temporal.
- Tras procesar todos los registros del cursor se inserta todo el


contenido
de la tabla temporal en la tabla real de la BD y se elimina la tabla
temporal.

La duración de todo el proceso hoy mismo, con los índices en perfecto


estado
y el servidor prácticamente sin nada más en ejecución ha sido de poco más


de
7 horas, habiendo procesado cerca de 320.000 filas en total.
Aunque son 17 selects sólo acceden a datos de 5 tablas. Estas tablas son
grandes (2 tablas con cerca de 23 millones de filas y las otras 3 entre 1


y
2 millones) pero como he dicho, tienen índices creados en todos los campos
por los que se accede.
Ya digo que lo extraño es que esto no ocurre siempre, y normalmente las
condiciones de ejecución son siempre las mismas.
Espero que fuera lo que pedías.

Un saludo


Respuesta Responder a este mensaje
#5 Jose Mariano Alvarez \(MUG\)
10/02/2004 - 04:41 | Informe spam
Al igual que Maxi y Adrian creo que podrias intentar eliminar el cursor.
No se que equipo usas (procesadores/discos/memoria) pero me parece que es
demasiado tiempo y me acerco mucho mas a los tiempos que esperaria Adrian,
aunque soy un poco mas cauteloso debido a que tienes al menos 15 joins y
debes ser cuidadoso para no hacer perder al motor en la elecion de la
estrategia que va a usar para aceder a los datos.

Tambien opino que deberias poder resolvelo con join o a lo sumo con
subqueries ralcionados.

Select
campo1,
campo2,
campo3,
(select dato from UnaTablaDeLas15 where "Condicion de correlacion")
dato2,
from mi_tabla1
union
etc


En lugar de usar una tabla temporal podrias usar una tabla normal, con
indice clustered y algun otro indice mas si es necesario.
Que tengas indices no significa que los use o que sirvan para la consulta en
cuestion.
Debes verificar que realmente los use.
Sospecho que no por el tiempo que tarda.

Tu proceso ha ido variando con el tiempo y se ha puesto mas lento?
Si es asi, seguro tienes SCAN en algun lado.

Acceder a un registro por indice, si el indice es convergente, es casi lo
mismo en una tabla de 10.000 registros que en una de 10.000.000.000.

Que no dure siempre lo mismo imagino que puede deberse a las caracteristicas
de los datos o a las estadisticas al momento de procesar. Cuando creas
tablas temporales la misma no tiene estadisticas ya que no tiene datos y
debe usar heuristicas para determinar el plan de ejcucion apropiado. Es mas
si usas stored procedure los va a recompilar varias veces..

Si tienes muchas tablas que se llenan y se vacian en la logica de tu
proceso, es probable que debas desactivar la actualizacion automatica de las
estaditicas y realizarla a mano.


Jose Mariano Alvarez
Comunidad de base de datos
Grupo de Usuarios Microsoft
www.mug.org.ar


"Adrian D. Garcia" wrote in message
news:
7 hs????
Por lo que realiza el proceso no deberia tardar mas de 20 minutos

1) El calculo de fechas se puede resolver con un SELECT simple?
2) No se puede resolver con JOINS la consultas a las 15 tablas? Creo que


si
3) Si hay varios casos de calculos se podria generar una tabla temporal de
movimientos con el UNION y los JOINS de las demas tablas, luego si hay
varios casos de calculos diferentes se podria hacer varias instrucciones


de
UPDATE o INSERT diferentes en la tabla de resultado.
4) El traspaso de informacion de la tabla temporal a la tabla real tambien
creo que se podria hacer con una instruccion de INSERT SELECT o UPDATE.


Saludos
Adrian D. Garcia
MCSD
NDSoft Consultoria y Desarrollo

"Eje" wrote in message
news:c08dr8$13u1iu$
> Maximiliano D. A.
> >
> > pd: me preocupa el trabajo con esos cursores y sobre todo el tiempo


que
> > tarda, quizas lo debamos ver con mayor informacion
>
> Gracias por la información, te comento un poco cómo funciona el
> procedimiento:
> - Se calculan las fechas del periodo de cálculo a procesar.
> - Se crea una tabla temporal para ir almacenando los resultados.
> - Se rellena un cursor con los datos de dos tablas (con un UNION) con


los
> registros que han tenido movimientos en ese periodo y que, por lo tanto,
hay
> que calcular.
> - Por cada registro del cursor se realizan una serie de selects simples


a
> otras tablas (15 en total), buscando registros por los valores que


tienen
lo
> campos del cursor (todos estos campos están indexados en las tablas en


las
> que se busca). Estas selects devuelven, cada una, una cantidad numérica.
Con
> todas esas cantidades se efectuarán los cálculos (muy simples, sumas y
> restas), grabándose el resultado en la tabla temporal.
> - Tras procesar todos los registros del cursor se inserta todo el
contenido
> de la tabla temporal en la tabla real de la BD y se elimina la tabla
> temporal.
>
> La duración de todo el proceso hoy mismo, con los índices en perfecto
estado
> y el servidor prácticamente sin nada más en ejecución ha sido de poco


más
de
> 7 horas, habiendo procesado cerca de 320.000 filas en total.
> Aunque son 17 selects sólo acceden a datos de 5 tablas. Estas tablas son
> grandes (2 tablas con cerca de 23 millones de filas y las otras 3 entre


1
y
> 2 millones) pero como he dicho, tienen índices creados en todos los


campos
> por los que se accede.
> Ya digo que lo extraño es que esto no ocurre siempre, y normalmente las
> condiciones de ejecución son siempre las mismas.
> Espero que fuera lo que pedías.
>
> Un saludo
>
>


Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida