Zapytanie takie jak poniższe, które gwarantuje, że nie zwróci żadnych wierszy, zajmuje od 0 do 160 sekund na jednym z naszych serwerów:
select col1, col2, col3
from tab1
where 0 = 1
Dwa tygodnie temu zdarzyło się to sześć razy w odstępie 48 godzin. W zeszłym tygodniu to samo zapytanie zajęło ~ 0 sekund. Mam dzienniki SQL aplikacji, ale nie znalazłem jeszcze żadnych podejrzanych. Poza tym pomyślałem, że zapytanie typu 0 / gdzie 0 = 1 nigdy nie trafia na strony danych, więc powinno być odporne na blokady danych na poziomie wiersza / strony / tabeli? Schemat nie jest dotykany przez żadne (znane) zapytania SQL.
Ponieważ problem nie jest spójny, a serwer jest bardzo obciążony, chciałbym zrozumieć teorię tego, co się dzieje przed dołączeniem profilera SQL. Inne zapytania działają bezproblemowo podczas tych opóźnień. Znanym problemem w aplikacji jest duża liczba dynamicznie tworzonych zapytań SQL - około 200 000 unikalnych zapytań z 850 000 zapytań ogółem (zarejestrowanych) w ciągu 48 godzin, czy może to powodować takie problemy?
Na serwerze działa wersja standardowa SQL Server 2005, 96 GB pamięci RAM, dyski w sieci SAN i 4 procesory / 16 rdzeni. Pliki baz danych i aplikacjami są dobrze zoptymalizowane i nie powinno stanowić problemu (ale analizujemy to osobno).
Wszelkie wskazówki, gdzie szukać, są bardzo mile widziane.
Edycja: Idealnie! Ponownie odtworzyło zapytanie, aby dodać plan wykonania, i zajęło 1min 35secs. Oto plan wykonania i zrzut ekranu pokazujący czas trwania zapytania:

Edycja 2: szczegóły czasu statystyki dla drugiego przebiegu. Wygląda na to, że teraz jest konsekwentnie wolny, więc dołączymy profiler i perfmon:
SQL Server Execution Times:
CPU time = 0 ms, elapsed time = 97402 ms.
SQL Server parse and compile time:
CPU time = 0 ms, elapsed time = 0 ms.
