Середовище:
У нас є два 32-розрядні машини Windows Server 2003 R2, на яких працює SQL Server 2005. Апаратні конфігурації - це однакові сервери з процесором Xeon 5160, 4 Гб оперативної пам’яті та 13 ГБ RAID0. Прапор AWE та / 3 Гб не ввімкнено.
Сервери були встановлені поруч за допомогою попередньо визначеного контрольного списку встановлення, і ВСЕ встановлене програмне забезпечення однакове на обох машинах.
Кожен параметр встановлення SQL-сервера та рівень патча, який ми знаємо, щоб перевірити, є однаковими. Одна відмінність полягає в тому, що TEMPDB - це 400 Мб на швидкій машині, а на повільній - 1,2 ГБ. Однак в обох випадках ми не бачимо жодного розподілу TEMPDB.
Проблема:
Існує збережена процедура, яка працює на 2 секунди на одній, але на 15 хвилин на іншій. Протягом додаткових 15 хвилин дискової активності майже немає, не змінюється використання пам'яті, але одне ядро CPU закріплюється на 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 хвилин. (Ні, я не знаю, чому це два підряд, потрібно запитати у розробників, але він працює правильно на обох серверах).
Мені трохи підозріло те, що "НЕ В (ВИБІР ...)", оскільки, схоже, віртуальні читання дійсно великі.