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!
fuente
Respuestas:
Siga los pasos descritos en Cómo usar el
DBCC MEMORYSTATUS
comando 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.
fuente
Parece que desea ir para la
Extended Events
configuración utilizando los eventosquery_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 ...
fuente