Відсутні плани виконання збережених процедур


12

Які причини відсутності плану в кеші для збережених процедур?

  1. WITH RECOMPILE
  2. Динамічний SQL
  3. Зашифрований код
  4. Значні зміни даних
  5. Оновити статистику
  6. Що ще?

Нещодавно я працював на двох серверах (SQL Server 2008 R2 та SQL Server 2012), у яких не було планів кеш-пам'яті для дуже складних процедур, що зберігаються. У багатьох, можливо, всіх висловлювань всередині збережених процедур також не було планів у кеші. Деякі із збережених процедур виконуються досить часто, як кілька разів на секунду.

Жодного тиску пам'яті немає. На одному з серверів є набагато більше апаратного забезпечення, ніж потрібно.

Я вважав, що відсутні плани були пов’язані з тимчасовими створеннями таблиць посеред збережених процедур, але це, здається, стара інформація з SQL Server 2000 або раніше. Починаючи з SQL Server 2005, перекомпіляції відбуваються на рівні операторів для операторів після DDL. Це правда у всіх випадках чи все ж може статися в нових версіях?

Що ще може бути винуватцем відсутніх планів? Я пропустив кілька статей на цю тему, але нічого, здається, не підходить.

Оптимізація навантажень adhoc увімкнена на сервері, на якому я переглядаю цей тиждень. Одна із збережених процедур виконується лише раз на день. У мене є код для цього. У мене немає коду для того, який виконується понад 100 разів на хвилину, але я можу його отримати. Я не зможу розмістити код, але можу описати його стосовно мого запитання.

Я не вірю, що хтось звільняє кеш процедур або видаляє чисті буфери. Цей клієнт використовує Solarwinds DPA як один із своїх інструментів моніторингу. DPA зафіксував один із планів виконання для оператора у збереженій програмі, яка викликається раз на день. Цей вислів має велику кількість прочитаних через необов'язковий WHEREпункт. Якщо DPA зафіксувала заяву, то це приблизний план і був у кеші плану свого часу. Просто немає, коли ми вирішуємо проблеми. Я змушу їх почати входити sp_WhoIsActiveв таблицю.

Я використовую sp_BlitzCache. (Я працюю в Brent Ozar Unlimited) Тут буде показано план всієї збереженої процедури, а також плани окремих заяв, якщо вони існують. Якщо їх не існує, він містить це попередження: "Ми не змогли знайти план цього запиту. Можливі причини цього включають динамічний SQL, RECOMPILEпідказки та зашифрований код." І це попередження є і на заявах.

TF 2371 не на місці. Я переглядаю статистику очікування. Сервер досить нудно. PLE - понад 130 000.

Тепер у мене є код для ще 2 збережених процедур. Один з них використовує динамічний SQL, exec (@sql)щоб ми знали, чому не існує плану. Але інший, і це той, що працює понад 100 разів на хвилину, не має нічого спільного. Єдине, що вирізняється в тому, що це тим, що тимчасові таблиці створюються посеред понад 1000 рядків коду. Він також викликає купу процедур, що зберігаються для дітей.

Щодо керування планами в SQL Server 2008 , я не бачу жодних літералів> = 8k, але одна із збережених процедур має коментар щодо об'ємної вставки прямо перед тим, як викликати іншу збережену процедуру. Але об'ємна вставка не відображається у зовнішній збереженій процедурі, яку я переглядаю. Цікавий розділ «Поріг перекомпіляції». Що я бачу для тимчасових таблиць - це тони ВСТАВКИ (які можуть призвести до мільйонів рядків), деякі оновлення та видалення. Так багато даних змінюються у тимчасових таблицях. Мільйони.


Чи є у вас збережені програми, які повторно виправляють проблему, чи можете ви створити мінімальний приклад, який спростує її, і, роблячи це, з'ясовуйте проблему?
Мартін Сміт

Відповіді:


3

Є два DMF кешу плану:

sys.dm_exec_query_plan - повертає кешовані плани у форматі XML, але лише до певного розміру (і лише до тих пір, поки вони можуть бути відформатовані як XML на SQL Server, що означає до 128 вкладених рівнів.)

sys.dm_exec_text_query_plan - повертає кешовані плани у текстовому форматі будь-якого розміру. Але недолік полягає в тому, що, коли плани великі, ви не можете перетворити їх у XML всередині SQL Server, і навіть TRY_CONVERT, оскільки XML повертає нуль.

sp_BlitzCache потрапляє лише на колишній DMV (оскільки йому потрібно проаналізувати плани запитів як XML, щоб зробити всі види нарізки та дикінгу.) Я зробив випуск Github №838, щоб покращити це, щоб ми могли принаймні попередити користувачів перейти перевірити sys.dm_exec_text_query_plan на їхній більші запити. Ми все ще не зможемо зробити аналіз XML на ньому.


А також з тієї ж причини sys.query_store_plan.query_planце nvarchar(MAX)НЕ XML (SQL дрібниці).
Рем Русану

@RemusRusanu ooo, так великі плани з’являються там! Приємно.
Брент Озар

Ми перевіряємо, чи відсутні плани, пов'язані з тим, що ви знайшли. Як тільки почую, я опублікую оновлення.
Тара Кізер

Я відзначаю це як відповідь, хоча я не чув від клієнта. Це єдине, що може бути, і має сенс, враховуючи величезні запити. Я опублікую оновлення, якщо щось зміниться.
Тара Кізер

@TaraKizer ви це робите лише тому, що ваш квартальний огляд надходить, правда? Я бачу, що ви там робили. БОНУС НЕЗАКОНЕН.
Брент Озар

0

Можливо, вам потрібно відрегулювати максимальний розмір XML, який SSMS може повернути до сітки?


Ні, тому що, як зазначає Тара, навіть якщо ви запишете його в таблицю і перевіряєте там довжину, дані не повертаються.
Брент Озар
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.