Mamy serwer bazy danych SQL Server 2008 (zdarza się, że działa on w trybie MS Failover Clustering, ale nie sądzę, żeby miało to znaczenie tutaj).
Nasza aplikacja działa w trybie hibernacji w celu uzyskania dostępu do bazy danych, a ponieważ ostatnio zaktualizowaliśmy wersję 3.1 do wersji 3.6, regularnie występują awarie programu SQL Server (co 24–48 godzin, ale czasem częściej).
Konkretny problem wydaje się związany z pamięcią. Tuż przed awarią serwera (i wydaje się, że jest on następnie automatycznie restartowany przez menedżera klastra pracy awaryjnej), otrzymujemy mnóstwo tych błędów:
Error: 701, Severity: 17, State: 130.
There is insufficient system memory in resource pool 'internal' to run this query.
także sporadyczne (ale regularne) wiadomości
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.
Błąd: 17312, wskaźnik ważności: 16, stan: 1. (Params :). Błąd jest drukowany w trybie zwięzłym, ponieważ wystąpił błąd podczas formatowania. Śledzenie, ETW, powiadomienia itp. Są pomijane.
Otrzymuję również błędy na poziomie aplikacji, takie jak
java.sql.SQLException: A time out occurred while waiting to optimize the query. Rerun the query.
a następnie ekscytujący i być może pouczający błąd:
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.
Obciążenie serwera nie zmieniło się, więc nie ma powodu, dla którego powinno zabraknąć mu pamięci, gdy wcześniej nie wskazywał problemu z wysyłaniem zapytań do niego.
Teraz pytanie - jak prześledzić zapytania, które powodują ten błąd (a więc prawdopodobnie wszystkie problemy)? Wygląda na to, że od czasu naszej aktualizacji Hibernacji wywołuje on ogromne zapytania w SQL Server, i to się zepsuło. Tak się składa, że mam kilka pomysłów, co to może być, ale dobrze byłoby móc je wyśledzić.
Oczywiście mogę uruchomić narzędzie do profilowania programu SQL Server, ale kiedy to zrobisz (i wygenerujesz ogromną ilość danych - jest to zajęta baza danych OLTP), jak mogę filtrować, aby znaleźć problematyczne zapytania?
Dzięki!