Розуміння статистики, планів виконання та "ключова проблема"


11

Я намагаюся краще зрозуміти (концептуально) взаємозв'язок між статистикою, планами виконання, виконанням збереженої процедури.

Чи правильно я кажу, що статистичні дані використовуються лише при створенні плану виконання збереженої процедури, і вони не використовуються в реальному контексті виконання? Іншими словами, якщо це правда, як тільки план створений (і якщо припустити його належним чином повторно використати), наскільки важливі "актуальні" статистичні дані?

Мене особливо мотивувала стаття, яку я прочитав ( Статистика, оцінки рядків та стовпчик дати зростання ), в якій описується сценарій, дуже схожий на той, з яким я щодня стикаюсь з декількома базами даних наших клієнтів.

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

Як запобігти зростанню планів виконання, коли в день додається сто тисяч рядків?

Якщо ми часто оновлюємо статистику для боротьби з цією проблемою, чи має сенс використовувати підказку OPTION (RECOMPILE) на запит цієї збереженої процедури?

Будь-які поради чи рекомендації будуть вдячні.

Оновлення : я використовую SQL Server 2012 (SP1).

Відповіді:


5

Чи правильно я кажу, що статистичні дані використовуються лише при створенні плану виконання збереженої процедури, і вони не використовуються в реальному контексті виконання?

Ні, що трапляється, це те, що план виконання збереженої процедури є кешованим. Якщо припустити, що є достатня кількість пам'яті, щоб продовжувати тримати план, він не зміниться, якщо не відбудеться одне з наступних дій (з кешування плану виконання та повторного використання в документації на SQL Server, акцент додано):

  • Зміни, внесені до таблиці або перегляду, на які посилається запит (ALTER TABLE та ALTER VIEW).
  • Зміни, внесені до єдиної процедури, які б вивели всі кеші для цієї процедури з кешу (ALTER PROCEDURE).
  • Зміни будь-яких індексів, які використовуються планом виконання.
  • Оновлення статистики, використовуваної планом виконання, генерується або явно з заяви, наприклад ОНОВЛЕННЯ СТАТИСТИКИ, або генерується автоматично.
  • Випадання індексу, який використовується планом виконання.
  • Явний виклик sp_recompile.
  • Велика кількість змін ключів (породжених операторами INSERT або DELETE від інших користувачів, які змінюють таблицю, на яку посилається запит).
  • Для таблиць з тригерами, якщо кількість рядків у вставлених або видалених таблицях значно зростає.
  • Виконання збереженої процедури за допомогою опції З РЕКОМПЛІЮ.

Отже, якщо статистичні дані оновлюються, кешований план автоматично враховує нові статистичні дані та буде перекомпільований.

Як запобігти зростанню планів виконання, коли в день додається сто тисяч рядків?

Один із способів - якщо в таблиці багато оновлень, як згадувалося вище. Кілька сотень тисяч змінених рядків можуть задовольнити цю умову. Але якщо ви хочете бути впевненими або мати більш детальний контроль: оновивши статистику. Ви можете дозволити SQL Server автоматично створювати та керувати статистикою або вручну робити це самостійно. Додаткову інформацію про будь-який метод ви можете знайти в розділі Автоматичне оновлення SQL Server та параметри автоматичного створення статистики . Коли / якщо ви робите щотижневу перебудову індексів, це також спричинить оновлення планів. Зробіть тестування, щоб побачити, що вам найбільше вигідно, оскільки оновлення статистики занадто часто може не дати реальних результатів.

Якщо ми часто оновлюємо статистику для боротьби з цією проблемою, чи має сенс використовувати підказку OPTION (RECOMPILE) на запит цієї збереженої процедури?

Вам не потрібно користуватися RECOMPILE, оскільки виходячи з уривку вище, ви можете бачити, що план виконання оновлюється належним чином, коли з'являються нові статистичні дані. Можливо, ви будете добре з оновленням статистики в кінці дня (якщо ви справді переймаєтесь), але я не думаю, що це явно не потрібно, виходячи з того, що ви говорили до цього часу. Знову ж таки, я б протестував це, щоб побачити, який вплив це може мати на продуктивність вашої збереженої процедури, і спланувати відповідно.


RECOMPILEвсе одно не спричинить оновлення статистики.
Мартін Сміт

@MartinSmith Правильно! Я відредагую, щоб зробити це більш зрозумілим.
LowlyDBA

@LowlyDBA Ви могли б звернутися до наступної теми? dba.stackexchange.com/questions/207475/…
lukaszwinski

6

Правильно кажу, що статистика використовується лише при створенні плану виконання

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

У одній із найбільших таблиць, яку ми регулярно запитуємо, у нас стовпчик дати / часу за зростанням

Неоптимальні плани виконання, спричинені тим, що значення предикатів знаходяться поза (конкретно вище), діапазон значень, що зберігаються у відповідній гістограмі статистики, відомий як висхідна ключова проблема . Перебудова статистики - це одне можливе рішення, але воно може бути досить ресурсомістким. Альтернативи включають:

  • Сліди прапорців 2389 та 2390 . Для цього потрібен індекс із проблемним стовпцем як головним ключем. Він не працює з розділеними таблицями і ефективний лише в SQL Server 2014, якщо використовується оригінальний оцінювач кардинальності. Прапор трасування 4139 також може знадобитися, якщо об'єкт статистики є фірмовим.

  • Оновлення до SQL Server 2014. Новий оцінювач кардинальності включає логіку для оцінки за межами гістограми з використанням інформації середньої щільності. Це може бути менш точно, ніж прапори слідів 2389/2390 у деяких важливих обставинах.

  • Увімкніть частіші автоматичні оновлення статистики для великих таблиць із прапором 2371 . Якщо цей прапор слід, замість оновлення після 20% + 500 змін, потрібні лише SQRT(1000 * Table rows)зміни . Це не настільки повноцінне рішення, як ті, про які було сказано раніше, оскільки оновлення все ще може не запускатися досить часто.

Якщо джерелом вашої проблеми є не стільки часті складання плану на основі значень предикатів, що перевищують гістограму, а більше про наслідки періодичного кешування такого поганого плану в результаті нюху параметрів, ви також можете врахувати:

  • Вимкнення нюху параметрів за допомогою прапора трасування 4136
  • Використання OPTIMIZE FOR (@parameter = value)для складання плану за відомим репрезентативним значенням
  • Використання OPTIMIZE FOR (@parameter UNKNOWN)для оптимізації використання середнього розподілу
  • Використання OPTIMIZE FOR UNKNOWN(те саме, що 4136, але за запитом)
  • Використовуючи OPTION (RECOMPILE)для компіляції кожен раз, обнюхуючи конкретне значення. Якщо переважна більшість значень часу виконання є в гістограмі, це може бути ефективним.

Для отримання додаткової інформації про нюхання параметрів, вбудовування та параметри перекомпіляції див. Мою статтю на SQLperformance.com.

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