Środowisko:
Mamy dwa 32-bitowe komputery z systemem Windows Server 2003 R2 z programem SQL Server 2005. Konfiguracje sprzętowe to identyczne serwery z procesorem Xeon 5160, 4 GB pamięci RAM i 13 GB RAID0. Flagi AWE i / 3GB nie są włączone.
Serwery zostały skonfigurowane obok siebie przy użyciu wstępnie zdefiniowanej listy kontrolnej instalacji, a WSZYSTKIE zainstalowane oprogramowanie jest takie samo na obu komputerach.
Każde ustawienie instalacji serwera SQL i poziom łaty, które sprawdzamy, są identyczne. Jedną różnicą jest to, że TEMPDB ma 400 MB na szybkiej maszynie i 1,2 GB na wolnej maszynie. Jednak w obu przypadkach nie widzimy żadnej alokacji TEMPDB.
Problem:
Istnieje procedura składowana, która działa w ciągu 2 sekund z jednej, ale 15 minut z drugiej. W ciągu dodatkowych 15 minut aktywność dysku jest niewielka lub nie ma żadnych zmian w zużyciu pamięci, ale cały rdzeń procesora jest przypięty w 100%.
To zachowanie utrzymuje się, nawet gdy kopie zapasowe baz danych są przechowywane z jednej bazy danych i przywracane do drugiej.
Ponieważ jest to procedura przechowywana, monitor aktywności i profiler nie pokazują nam żadnych szczegółów na temat tego, gdzie w procedurze przechowywanej zachodzi ta wysoka aktywność procesora.
Pytanie:
Na co jeszcze powinniśmy patrzeć?
Kontynuacja:
Powolność występuje w instrukcjach FETCH NEXT dla następującej definicji kursora:
DECLARE C CURSOR FOR
SELECT X, Y
FROM dbo.A
WHERE X NOT IN (SELECT X FROM dbo.B)
AND Z <=0
...
<snip>
...
FETCH NEXT FROM C INTO @X, @Y
FETCH NEXT FROM C INTO @X, @Y
...
Każda z instrukcji FETCH - w tabeli zawierającej tylko około 1000 wierszy - wymaga około 7,25 minut. (Nie, nie wiem, dlaczego robi dwa z rzędu, muszę zapytać programistów, ale działa poprawnie na obu serwerach).
Jestem trochę podejrzliwy wobec tego „NOT IN (SELECT ...)”, ponieważ wygląda na to, że Virtual Reads jest naprawdę wysoki.