Окружение:
У нас есть два 32-разрядных компьютера с Windows Server 2003 R2 под управлением SQL Server 2005. Аппаратные конфигурации - это идентичные серверы с процессором Xeon 5160, 4 ГБ ОЗУ и 13 ГБ RAID0. Флаги AWE и / 3GB не включены.
Серверы были установлены параллельно с использованием предварительно определенного контрольного списка установки, и ВСЕ установленное программное обеспечение одинаково на обеих машинах.
Все установки SQL-сервера и уровень исправлений, которые мы проверяем, идентичны. Одно из отличий состоит в том, что TEMPDB составляет 400 МБ на быстрой машине и 1,2 ГБ на медленной. Однако в обоих случаях мы не видим распределения TEMPDB.
Проблема:
Существует хранимая процедура, которая выполняется за 2 секунды на одной, но 15 минут на другой. В течение дополнительных 15 минут активность диска практически отсутствует, использование памяти не изменяется, но одно ядро ЦП закреплено на все 100%.
Такое поведение сохраняется даже при резервном копировании баз данных из одной и восстановлении в другой.
Поскольку это хранимая процедура, монитор активности и профилировщик не показывают нам каких-либо подробностей о том, где в хранимой процедуре происходит такая высокая загрузка ЦП.
Вопрос:
На что еще мы должны смотреть?
Следовать за:
Замедление происходит в операторах FETCH NEXT для следующего определения курсора:
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
...
Каждый из операторов FETCH - в таблице, содержащей только около 1000 строк - требует около 7,25 минут. (Нет, я не знаю, почему он делает два подряд, нужно спросить разработчиков, но он работает правильно на обоих серверах).
Я немного подозрительно отношусь к этому «NOT IN (SELECT ...)», поскольку похоже, что Virtual Reads действительно высоко.