如果我在存储过程的定义中创建了Temp Tables
,然后使用它们dropping them when I am done
会导致重新编译执行计划吗?
对于存储过程每次调用它?任何个人经历? 请问有什么解释吗?
当在每次调用结束时删除临时表时,执行计划变为无效。 SQL Server是否仍然保留执行计划并在下次调用时重用,或者在每次调用时重新编译它。
答案 0 :(得分:6)
删除临时表并不重要。 如果创建了一个表(永久或临时),则重新编译该语句之后的所有语句(即使它们不引用该表)。不重新编译使用EXEC调用可执行对象。这是因为SQL Server可以在创建对象后创建计划。 (在这种情况下,临时表。)
您可以使用扩展事件及其sql_statement_recompile或SQL Trace / SQL Server Profiler SQL监视重新编译:StmtRecompile。
不是整个程序都是重新编译的,而只是单独的声明。
答案 1 :(得分:-2)
一般来说,商店过程中的任何DDL都会导致重新编译,然后如果使用create and drop table指令,您将获得重新编译。 可以通过将DDL作为商店过程中的第一个语句来减轻它,但是您应该先测试并在服务器中亲眼看到它。
如果必须放入时态表中的数据集很小而且不需要非唯一索引,则应尝试使用表变量。 在表变量中放置太多行并不是一个好主意,因为它们没有统计信息,Sql Server总是“认为”它们只有一条记录而且查询计划可能比最佳记录稍微远一点(但它会避免因创建时态表而重新编译。
答案 2 :(得分:-3)
临时表可能导致重新编译。这恰好是因为它们被SQL Server引擎视为常规表。当表(基础查询依赖于表)时 显着变化,SQL Server检测到此更改(使用自动更新统计信息)并标记要重新编译的相关查询,以便下一次执行可以创建最佳执行计划。
一旦临时表或依赖临时表的查询发生更改,查询引擎将无法执行相同的缓存计划,因为它无法容纳查询。
应该注意,表变量本身不会导致重新编译。在某些情况下,这些可能是更好的选择。
有关临时表重新编译的更多信息,请参阅http://sqlserverplanet.com/optimization/temp-table-recompiles
。