Wir haben einen SQL Server 2008-Datenbankserver (der zufällig unter MS Failover Clustering ausgeführt wird, aber ich denke nicht, dass dies hier relevant ist).
Unsere Anwendung führt Hibernate für den DB-Zugriff aus. Seit dem kürzlich durchgeführten Upgrade von Version 3.1 auf Version 3.6 stürzt SQL Server regelmäßig ab (alle 24 bis 48 Stunden, manchmal jedoch häufiger).
Das spezifische Problem scheint speicherbezogen zu sein. Kurz bevor der Server abstürzt (und dann anscheinend vom Failover-Cluster-Manager automatisch neu gestartet wird), werden folgende Fehler angezeigt:
Error: 701, Severity: 17, State: 130.
There is insufficient system memory in resource pool 'internal' to run this query.
auch gelegentliche (aber regelmäßige) Nachrichten von
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.
Fehler: 17312, Schweregrad: 16, Status: 1. (Parameter :). Der Fehler wird im knappen Modus gedruckt, da beim Formatieren ein Fehler aufgetreten ist. Ablaufverfolgung, ETW, Benachrichtigungen usw. werden übersprungen.
Ich bekomme auch einige Fehler auf App-Ebene wie
java.sql.SQLException: A time out occurred while waiting to optimize the query. Rerun the query.
und dann der aufregende und möglicherweise lehrreiche Fehler:
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.
Die Auslastung des Servers hat sich nicht geändert, daher gibt es keinen Grund, warum ihm jetzt der Speicher ausgehen sollte, wenn zuvor kein Problem mit an ihn gesendeten Abfragen angezeigt wurde.
Nun zur Frage: Wie verfolge ich die Abfragen, die diesen Fehler verursachen (und damit vermutlich alle Probleme)? Es scheint, dass seit unserem Hibernate-Upgrade einige große Abfragen bei SQL Server ausgelöst wurden, und das hat es kaputt gemacht. Zufällig habe ich einige Ideen, was sie sein könnten, aber es wäre gut, sie verfolgen zu können.
Ich kann natürlich den SQL Server-Profiler ausführen, aber wie kann ich filtern, um die problematischen Abfragen zu finden, sobald dies erledigt ist (und eine enorme Datenmenge erzeugt hat - es handelt sich um eine ausgelastete OLTP-Datenbank)?
Vielen Dank!