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!