我想知道 SQL Server 如何生成一个将“自动创建统计信息”设置为“关闭”的查询计划。
我在搜索答案时偶然发现了以下链接中的以下上下文(抱歉,我进行了搜索,但找不到更好的内容)。
https://www.simple-talk.com/sql/performance/execution-plan-basics/
表变量永远不会生成统计信息,因此优化器总是假定它们只有一行,而不管它们的实际大小
尽管以上仅适用于表变量,但我认为 SQL Server 将使用相同的原理来导出表的查询计划,因此决定做一个小测试。
我清除了 PROC 缓存并在包含 100 万条记录的表上运行以下查询
我的测试证明我错了,SQL 服务器报告缺少统计信息(如预期的那样),但是当没有统计信息时,估计的行数为 31622(我预计它是 1)。查询优化器是如何在没有统计数据的情况下得出这个值的?
表变量是另一回事,服务器在没有统计数据时使用的是对未知输入的估计:
因此,在您的情况下,估计将是 select power(1000000, 0.75) = 31622(= 2014 年之前具有非唯一列的谓词)
相关书籍:Itzik Ben-Gan 的 T-SQL 查询