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

#sql-server

#sql-сервер

Вопрос:

Вопрос для начинающих

но я считаю, что все еще существует большая путаница, поскольку это поведение изменилось между версиями SQL Server между SQL 2000 и SQL 2005 / более поздними версиями.

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

SQL 2005 и более поздние версии, даже если у вас есть временная таблица в определении вашего процесса, она не будет перекомпилироваться при каждом выполнении. План выполнения будет отправлен повторно.

Комментарии:

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

2. Проще говоря, заставляет ли наличие временной таблицы в хранимых процедурах ее перекомпилировать при каждом запуске?

3. Мой плохой, я только что протестировал это на моей временной таблице SQL 2008 R2 Express в sP, не приведет к перекомпиляции, и план будет возобновлен. У меня нет SQL 2000, поэтому я не могу протестировать, но у кого-нибудь все еще есть SQL2000, может подтвердить это

Ответ №1:

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

Смотрите Временные таблицы, табличные переменные и перекомпиляции в блоге команды разработчиков SQL Programmability amp; API. Перейдите к части, которая начинается с «Когда скомпилирована хранимая процедура DemoProc1, запрос insert и select не скомпилирован».

Комментарии:

1. Я советую всем, кто читает этот ответ, прочитать связанное сообщение в блоге, поскольку оно довольно четко объясняет, когда планы кэшируются, а когда нет. Не следует предполагать, что план обычно используется повторно.

2. Исходная ссылка больше не существует. Вот кэшированная копия с промежуточной машины ( web.archive.org/web/20120218072142/http://blogs.msdn.com/b /… )