Jak śledzić zapytania SQL, które powodują awarię SQL Server

9

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!

Pete Storey
źródło
1
Czy wszystko działa na tym samym serwerze? Czy serwer aplikacji z Javą działa również na serwerze bazy danych?
swasheck
1
W związku z pytaniem @ swasheck: Czy masz jawną wartość dla maksymalnej pamięci SQL Server? Czy wykluczyłeś presję pamięci zewnętrznej?
Mike Fal
Próbowałeś zobaczyć ślady czarnej skrzynki? Mogą skierować cię w dobrym kierunku.
datagod
Właśnie w to uderzyłem, a ślady, które zostawiłem uruchomione, pokazują bezczynną bazę danych z perspektywy aplikacji.
Joshua
Czy korzystasz z wyszukiwania pełnotekstowego? Ponadto, jaka jest dokładna wersja kompilacji no + serwera SQL, na którym pracujesz?
Kin Shah,

Odpowiedzi:

5

Postępuj zgodnie z krokami opisanymi w Jak używać DBCC MEMORYSTATUSpolecenia do monitorowania zużycia pamięci na SQL Server . Działanie naprawcze będzie zależeć od twoich ustaleń. Możesz także przeczytać Jak rozpoznać wąskie gardła pamięci Microsoft SQL Server, które są bardziej dostępne.

Jedno słowo ostrzeżenia: jest mało prawdopodobne, że znajdziesz indywidualne pytania do winy. Śledzenie problemów z pamięcią jest bardziej subtelne. Pamiętaj, że gdy kończą się zasoby, a zapytanie generuje błąd braku pamięci, może się zdarzyć, że zapytanie, które generuje błąd, jest tylko ofiarą , a nie winowajcą.

Remus Rusanu
źródło
Dzięki - już na nie patrzyłem, ale problem polega na tym, że serwer wydaje się działać dobrze, a potem nagle zaczyna hukać, nie zaczyna mu brakować pamięci. Z niczego, co mogę znaleźć online, nie jest również jasne, jaki jest błąd „W wewnętrznej puli zasobów jest za mało pamięci„ wewnętrznej ”, aby uruchomić to zapytanie”. w rzeczywistości oznacza - jaka jest wewnętrzna pula zasobów w odniesieniu do wyników DBCC MEMORYSTATUS?
Czy to serwer programistyczny? Jeśli tak, czy możesz przejść na Hibernację 3.1, aby sprawdzić, czy problem zniknął? Masz dwie początkowe linie zapytania i musisz spróbować wyeliminować jedną z nich, albo SQL Server ma ustawione limity pamięci i je przekracza, albo inna część systemu zużywa pamięć i SQL Server jest ściskany. Profiluj system w czasie awarii, aby określić, co się dzieje.
epo
0

Wygląda na to, że chcesz przejść do Extended Eventskonfiguracji za pomocą zdarzeń query_memory_grant_xxxxx.

Jest to najlepsza opcja do rejestrowania informacji i przechowywanego silnika SQL o rozmiarach, które można odczytać w dowolnym momencie (można także oglądać dane na żywo), przechowywane informacje nie zostaną usunięte, gdy nastąpi restart serwera DMVs

Kroki szybkiej konfiguracji ..

Shekar Kola
źródło