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