Abbiamo un server di database SQL Server 2008 (sembra essere in esecuzione in MS Failover Clustering, ma non credo che sia rilevante qui).
La nostra applicazione esegue Hibernate per l'accesso al DB e da quando abbiamo aggiornato di recente dalla v3.1 alla 3.6, abbiamo riscontrato un arresto anomalo regolare di SQL Server (ogni 24-48 ore, ma a volte più frequentemente).
Il problema specifico in questione sembra essere legato alla memoria. Poco prima che il server si arresti in modo anomalo (e quindi viene riavviato automaticamente dal gestore cluster di failover), otteniamo un carico di questi errori:
Error: 701, Severity: 17, State: 130.
There is insufficient system memory in resource pool 'internal' to run this query.
anche messaggi occasionali (ma regolari) di
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.
Errore: 17312, gravità: 16, stato: 1. (Params :). L'errore viene stampato in modalità concisa perché si è verificato un errore durante la formattazione. Traccia, ETW, notifiche ecc. Vengono saltati.
Ricevo anche alcuni errori a livello di app come
java.sql.SQLException: A time out occurred while waiting to optimize the query. Rerun the query.
e poi l'errore emozionante e forse istruttivo:
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.
Il carico sul server non è cambiato, quindi non c'è motivo per cui ora dovrebbe rimanere senza memoria quando in precedenza non indicava un problema con le query che gli venivano inviate.
Ora alla domanda: come posso rintracciare le query che causano questo errore (e quindi presumibilmente tutti i problemi)? Sembra che dal nostro aggiornamento di Hibernate, abbia lanciato alcune enormi query su SQL Server, e questo è rotto. In effetti, ho alcune idee su cosa potrebbero essere, ma sarebbe bello poterle rintracciare.
Ovviamente posso eseguire il profiler di SQL Server, ma una volta fatto (e prodotto un'enorme quantità di dati - è un database OLTP occupato), come posso filtrare per trovare le query problematiche?
Grazie!