Правильно ли я сказал, что статистика используется только при создании плана выполнения хранимой процедуры и не используется в реальном контексте выполнения?
Нет, происходит следующее: план выполнения хранимой процедуры кэшируется. Если предположить, что памяти достаточно для продолжения хранения плана, она не изменится, если не произойдет одно из следующих событий (из раздела Кэширование и повторное использование плана выполнения в документации по SQL Server, выделение выделено):
- Изменения, внесенные в таблицу или представление, на которые ссылается запрос (ALTER TABLE и ALTER VIEW).
- Изменения, внесенные в одну процедуру, которая удаляла бы все планы для этой процедуры из кэша (ALTER PROCEDURE).
- Изменения любых индексов, используемых планом выполнения.
- Обновления статистики, используемые планом выполнения, генерируемые либо явно из инструкции, такой как UPDATE STATISTICS, либо генерируемые автоматически.
- Удаление индекса, используемого планом выполнения.
- Явный вызов sp_recompile.
- Большое количество изменений ключей (генерируемых операторами INSERT или DELETE от других пользователей, которые изменяют таблицу, на которую ссылается запрос).
- Для таблиц с триггерами, если количество строк во вставленных или удаленных таблицах значительно возрастает.
- Выполнение хранимой процедуры с использованием параметра WITH RECOMPILE.
Поэтому, если статистика обновляется, кэшированный план автоматически учитывает новую статистику и перекомпилируется.
Как вы предотвращаете устаревание планов выполнения, если в день добавляется по сто тысяч строк?
Один из них - если в таблице много обновлений, как указано выше. Несколько сотен тысяч измененных строк могут удовлетворить это условие. Но если вы хотите быть уверены или имеете более детальный контроль: обновите свою статистику. Вы можете разрешить SQL Server автоматически создавать и управлять статистикой или вручную делать это самостоятельно. Вы можете найти дополнительную информацию о любом из этих методов в разделах «Автоматическое обновление SQL Server» и «Параметры автоматического создания статистики» . Когда / если вы выполняете еженедельную перестройку индексов, это также приведет к обновлению планов. Проведите некоторое тестирование, чтобы увидеть, что для вас наиболее выгодно, поскольку слишком частое обновление статистики может не дать никаких реальных результатов производительности.
Если мы часто обновляем статистику для решения этой проблемы, имеет ли смысл использовать подсказку OPTION (RECOMPILE) для запроса этой хранимой процедуры?
Вам не нужно использовать RECOMPILE
, так как на основе приведенного выше отрывка вы можете видеть, что план выполнения обновляется соответствующим образом при появлении новой статистики. Возможно, вам подойдет обновление статистики на конец дня (если вы действительно обеспокоены), но я не думаю, что это явно необходимо, исходя из того, что вы сказали до сих пор. Опять же, я бы протестировал его, чтобы увидеть, как это может повлиять на производительность хранимых процедур, и планировать соответственно.
RECOMPILE
не приведет к обновлению статистики в любом случае.