我一直在构建存储过程,但找不到任何关于 SQL Server 优化器如何处理 #temp 表的文档。
如果我有 4 个连接到 #temp 表,其中在存储过程执行期间创建了该 #temp 表,并且 #temp 表可能包含零到多条记录,它是如何估计的?
由于CREATE/ALTER时没有统计信息,估计和join中的一些表一样大吗?估计很小吗?估计和其他#temporary表一样吗?
请注意,这是假设在执行时没有重新编译并且使用原始版本。
我一直在构建存储过程,但找不到任何关于 SQL Server 优化器如何处理 #temp 表的文档。
如果我有 4 个连接到 #temp 表,其中在存储过程执行期间创建了该 #temp 表,并且 #temp 表可能包含零到多条记录,它是如何估计的?
由于CREATE/ALTER时没有统计信息,估计和join中的一些表一样大吗?估计很小吗?估计和其他#temporary表一样吗?
请注意,这是假设在执行时没有重新编译并且使用原始版本。
SQL Server 通常会在存储过程开始执行之前为存储过程中的语句构建一套完整的执行计划。
当存在临时表时,该方法会稍作修改:
从有关重新编译执行计划的文档中:
并来自表变量延迟编译:
这是基本的大纲,但不是全部。
正如在另一个答案中已经指出的那样,存储过程中的临时表也可以被缓存以供重用。这种缓存可以显着提高性能和可伸缩性,但它确实使计划重新编译的条件和统计信息的维护方式变得复杂。
我在Temporary Table Caching Explained和Temporary Table Caching in Stored Procedures 中为感兴趣的(和高级的)读者描述了这些额外的复杂性。
粗略地说,在#temp 表上创建统计信息的基数估计遵循常规非临时表的基数估计。话虽如此,正如Paul White在这里指出的那样,存储过程中的临时表可能会受到缓存统计值的影响。
从上面的页面可以看出:
我建议看一下这篇文章,以彻底了解临时表缓存对您的影响。