Фон
У мене працює запит проти SQL Server 2008 R2, який приєднує та / або залишає об'єднання приблизно 12 різних "таблиць". База даних досить велика: багато таблиць розміром понад 50 мільйонів і приблизно 300 різних таблиць. Це для великої компанії, яка має 10 складів по всій країні. Усі склади читають і записують у базу даних. Тож він досить великий і досить зайнятий.
Запит, з яким я маю проблеми, виглядає приблизно так:
select t1.something, t2.something, etc.
from Table1 t1
inner join Table2 t2 on t1.id = t2.t1id
left outer join (select * from table 3) t3 on t3.t1id = t1.t1id
[etc]...
where t1.something = 123
Зауважте, що одне з об'єднань знаходиться на некорельованому підзапиті.
Проблема полягає в тому, що починаючи сьогодні вранці, без будь-яких змін (про які я знаю я або хтось із моєї команди) до системи, запит, який зазвичай займає близько 2 хвилин, почав займати півтори години - коли це бігав зовсім. Інша база даних гуде просто чудово. Я взяв цей запит із проростка, який він зазвичай запускається, і я запускав його в змінних параметрів SSMS з жорстко кодованими параметрами з однаковою повільністю.
Дивність полягає в тому, що коли я беру неспіввіднесений підзапит і кидаю його в таблицю темпів, а потім використовую, що замість підзапиту, запит працює нормально. Також (і це найдивніше для мене), якщо я додаю цей фрагмент коду до кінця запиту, запит працює чудово:
and t.name like '%'
З цих маленьких експериментів я зробив висновок (можливо, неправильно), що причина уповільнення пов'язана з тим, як налаштований кешований план виконання SQL - коли запит трохи інший, він повинен створити новий план виконання.
Моє запитання таке: Коли запит, який раніше швидко запускався, раптово починає повільно працювати посеред ночі, і нічого іншого не впливає, окрім цього одного запиту, як я його усуваю і як уникнути його в майбутньому ? Звідки я можу знати, що SQL робить всередині, щоб зробити його таким повільним (якщо поганий запит запустився, я міг би отримати його план виконання, але він не запуститься - можливо, очікуваний план виконання мені щось дасть?)? Якщо ця проблема пов'язана з планом виконання, як я не можу думати SQL, що справді хитрі плани виконання - це гарна ідея?
Крім того, це не проблема з обнюхуванням параметрів. Я бачив це раніше, і це не все, тому що навіть коли я жорстко кодую вараліати в SSMS, я все ще отримую повільну продуктивність.