Cómo rastrear consultas SQL que están bloqueando SQL Server

9

Tenemos un servidor de base de datos SQL Server 2008 (se está ejecutando bajo MS Failover Clustering, pero no creo que sea relevante aquí).

Nuestra aplicación ejecuta Hibernate para el acceso a la base de datos, y desde que actualizamos recientemente de v3.1 a 3.6, hemos experimentado fallas en SQL Server regularmente (cada 24-48 horas, pero a veces con mayor frecuencia).

El problema específico en cuestión parece estar relacionado con la memoria. Justo antes de que el servidor falle (y luego parece que el administrador de clúster de conmutación por error lo reinicia automáticamente), obtenemos una carga de estos errores:

Error: 701, Severity: 17, State: 130.
There is insufficient system memory in resource pool 'internal' to run this query.

también mensajes ocasionales (pero regulares) de

Error: 17300, Severity: 16, State: 1. (Params:). The error is printed in terse mode because there was error during formatting. Tracing, ETW, notifications etc are skipped.

Error: 17312, Gravedad: 16, Estado: 1. (Parámetros :). El error se imprime en modo breve porque hubo un error durante el formateo. Se omiten el seguimiento, ETW, notificaciones, etc.

También recibo algunos errores de nivel de aplicación, como

java.sql.SQLException: A time out occurred while waiting to optimize the query. Rerun the query.

y luego el emocionante y posiblemente instructivo error:

The query processor ran out of internal resources and could not produce a query plan. 
This is a rare event and only expected for extremely complex queries or queries that reference a very large number of tables or partitions. 
Please simplify the query. If you believe you have received this message in error, contact Customer Support Services for more information.

La carga en el servidor no ha cambiado, por lo que no hay razón para que ahora se esté quedando sin memoria cuando anteriormente no indicaba un problema con las consultas que se le enviaban.

Ahora a la pregunta: ¿cómo puedo rastrear las consultas que están causando este error (y, por lo tanto, presumiblemente todos los problemas)? Parece que desde nuestra actualización de Hibernate, ha estado disparando algunas consultas enormes en SQL Server, y eso no funciona. De hecho, tengo algunas ideas sobre cuáles podrían ser, pero sería bueno poder rastrearlas.

Por supuesto, puedo ejecutar el perfilador de SQL Server, pero una vez que esto se hace (y produce una enorme cantidad de datos, es una base de datos OLTP ocupada), ¿cómo puedo filtrar para encontrar las consultas problemáticas?

¡Gracias!

Pete Storey
fuente
1
¿Todo se está ejecutando en el mismo servidor? Es decir, ¿el servidor de aplicaciones, con java, también se ejecuta en el servidor de la base de datos?
swasheck
1
En asociación con la pregunta de @ swasheck: ¿Tiene un valor explícito establecido para la memoria máxima de SQL Server? ¿Ha descartado la presión de la memoria externa?
Mike Fal
¿Has intentado mirar las huellas de la caja negra? Pueden señalarle en la dirección correcta.
datagod
Acabo de golpear esto, y las huellas que dejé en ejecución muestran una base de datos inactiva desde la perspectiva de la aplicación.
Joshua
¿Utiliza alguna búsqueda de texto completo? Además, ¿cuál es la compilación exacta no + edición del servidor SQL en el que está ejecutando?
Kin Shah

Respuestas:

5

Siga los pasos descritos en Cómo usar el DBCC MEMORYSTATUScomando para monitorear el uso de memoria en SQL Server . La acción de remedio dependerá de sus hallazgos. También puede leer Cómo identificar cuellos de botella en la memoria de Microsoft SQL Server, que es más accesible.

Sin embargo, una advertencia: es poco probable que encuentres consultas individuales a las que culpar. Rastrear problemas de memoria es más sutil que eso. Tenga en cuenta que cuando se está quedando sin recursos y una consulta arroja un error de falta de memoria, puede ser que la consulta que arroja el error sea solo la víctima , no el culpable.

Remus Rusanu
fuente
Gracias, ya los he visto, pero el problema es que el servidor parece funcionar bien y de repente se rompe, no se queda sin memoria gradualmente. Tampoco está claro por nada que pueda encontrar en línea cuál es el error "No hay suficiente memoria del sistema en el grupo de recursos 'interno' para ejecutar esta consulta". en realidad significa: ¿cuál es el grupo de recursos internos con respecto a los resultados de DBCC MEMORYSTATUS?
¿Es este un servidor de desarrollo? Si es así, ¿podría pasar a Hibernate 3.1 para verificar que el problema desaparezca? Tiene dos líneas iniciales de consulta y debe intentar eliminar una de ellas, o bien SQL Server tiene límites de memoria establecidos y los está excediendo o alguna otra parte del sistema está consumiendo memoria y SQL Server está siendo comprimido. Perfile el sistema alrededor de los tiempos del accidente para determinar qué está sucediendo.
epo
0

Parece que desea ir para la Extended Eventsconfiguración utilizando los eventos query_memory_grant_xxxxx.

Esta es la mejor opción para que registre la información y el motor SQL de gran tamaño almacenado que puede leer en cualquier momento (también puede ver datos en vivo), la información almacenada no se borrará cuando se reinicie el servidor a diferencia de DMVs

Pasos rápidos de configuración ...

Shekar Kola
fuente