Временные таблицы в хранимой процедуре приведут к перекомпиляции плана выполнения

Если у меня есть Temp Tables создается в определении хранимой процедуры, а затем dropping them when I am done с ними это приведет к перекомпиляции плана выполнения?

для хранимых процедур каждый раз, когда его называют? Личный опыт? Какие-нибудь объяснения, пожалуйста?

Как и при удалении временных таблиц в конце каждого вызова, план выполнения становится недопустимым. Сохраняет ли SQL Server план выполнения и повторно использует его при следующем вызове или перекомпилирует его каждый раз это называется.

3 ответов


удаление временной таблицы не имеет значения. Если создается таблица (постоянная или временная), все операторы после этой инструкции перекомпилируются (даже если они не ссылаются на таблицу). Вызовы исполняемых объектов с помощью EXEC не перекомпилируются. Это потому, что SQL Server может создать план после создания объектов. (В этом случае temp. таблица.)

вы можете отслеживать перекомпиляцию с помощью расширенных событий и его sql_statement_recompile или SQL Trace / SQL Server Профилировщик SQL:StmtRecompile.

  1. инструкция начинает выполняться. SP:StmtStarting или SQL: stmtstarting поднимается
  2. инструкция перекомпилируется. SQL: вызывается StmtRecompile. SP:StmtStarting или SQL: StmtStarting поднимается снова
  3. заявление закончена. SP:StmtCompleted или SQL: stmtcompleted поднимается

не вся процедура перекомпилируется, а только отдельные операторы.


вообще говоря, любой DDL в вашей процедуре магазина приведет к перекомпиляции, тогда, если вы используете инструкции create и drop table, вы получите перекомпиляцию. Его можно смягчить, включив DDL в качестве первого оператора в процедуру store, но вы должны протестировать его раньше и увидеть своими глазами на своем сервере.

Если набор данных, который вы должны поместить во временную таблицу, мал, и вам не нужны не уникальные индексы, вы должны попытаться использовать переменные таблицы вместо. Не стоит помещать слишком много строк в переменную таблицы, потому что у них нет статистики, Sql Server всегда "думает", что у них есть только одна запись, и план запроса может быть немного далек от оптимального(но это позволит избежать перекомпиляций из-за создания временной таблицы).


временные таблицы могут вызвать перекомпиляцию. Это происходит только потому, что они рассматриваются как обычные таблицы ядром SQL Server. Когда таблицы (в которых полагаются базовые запросы) существенно изменить SQL Server обнаруживает это изменение (используя статистику автоматического обновления) и помечает зависимые запросы для перекомпиляции, чтобы при следующем выполнении можно было создать оптимальный план выполнения.

Как только временная таблица или запросы, основанные на временной таблице, изменяют механизм запросов не удастся выполнить тот же кэшированный план, поскольку он не будет соответствовать запросу.

следует отметить, что табличные переменные по своей сути не вызывают перекомпиляцию. В некоторых ситуациях это может быть лучшим выбором.

посмотреть http://sqlserverplanet.com/optimization/temp-table-recompiles для получения дополнительной информации о перекомпиляции временных таблиц.