存储过程中的临时表将导致重新编译执行计划

时间:2013-10-27 20:11:49

标签: sql-server sql-server-2008 stored-procedures sql-server-2008-r2

如果我在存储过程的定义中创建了Temp Tables,然后使用它们dropping them when I am done会导致重新编译执行计划吗?

对于存储过程每次调用它?任何个人经历? 请问有什么解释吗?

当在每次调用结束时删除临时表时,执行计划变为无效。 SQL Server是否仍然保留执行计划并在下次调用时重用,或者在每次调用时重新编译它。

3 个答案:

答案 0 :(得分:6)

删除临时表并不重要。 如果创建了一个表(永久或临时),则重新编译该语句之后的所有语句(即使它们不引用该表)。不重新编译使用EXEC调用可执行对象。这是因为SQL Server可以在创建对象后创建计划。 (在这种情况下,临时表。)

您可以使用扩展事件及其sql_statement_recompile或SQL Trace / SQL Server Profiler SQL监视重新编译:StmtRecompile。

  1. 语句开始执行。 SP:StmtStarting或SQL:引发StmtStarting
  2. 该声明已重新编译。 SQL:引发StmtRecompile。 SP:StmtStarting或SQL:再次引发StmtStarting
  3. 声明完成。 SP:StmtCompleted或SQL:引发StmtCompleted
  4. 不是整个程序都是重新编译的,而只是单独的声明。

答案 1 :(得分:-2)

一般来说,商店过程中的任何DDL都会导致重新编译,然后如果使用create and drop table指令,您将获得重新编译。 可以通过将DDL作为商店过程中的第一个语句来减轻它,但是您应该先测试并在服务器中亲眼看到它。

如果必须放入时态表中的数据集很小而且不需要非唯一索引,则应尝试使用表变量。 在表变量中放置太多行并不是一个好主意,因为它们没有统计信息,Sql Server总是“认为”它们只有一条记录而且查询计划可能比最佳记录稍微远一点(但它会避免因创建时态表而重新编译。

答案 2 :(得分:-3)

临时表可能导致重新编译。这恰好是因为它们被SQL Server引擎视为常规表。当表(基础查询依赖于表)时 显着变化,SQL Server检测到此更改(使用自动更新统计信息)并标记要重新编译的相关查询,以便下一次执行可以创建最佳执行计划。

一旦临时表或依赖临时表的查询发生更改,查询引擎将无法执行相同的缓存计划,因为它无法容纳查询。

应该注意,表变量本身不会导致重新编译。在某些情况下,这些可能是更好的选择。

有关临时表重新编译的更多信息,请参阅http://sqlserverplanet.com/optimization/temp-table-recompiles