在SQL Server中,创建索引会自动为该索引创建统计信息对象,并使用它来确定最佳查询执行计划。
此外,还会自动为WHERE子句中使用的列创建统计信息对象-例如:
SELECT *
FROM AWSales
WHERE ProductID = 898
上面的查询自动为ProductID创建一个统计对象。这有什么目的?
由于非索引列未排序,并且它也不是B树结构,那么统计信息如何帮助选择比表扫描更好的查询计划?
我认为统计的目的是允许引擎在使用索引与否之间进行选择。以及使用搜寻还是扫描。我缺少什么知识?
答案 0 :(得分:2)
它的作用与为索引创建的统计信息相同。它将使用统计信息进行估算,以根据CPU时间和I / O来选择最佳执行计划。将选择成本最低的计划。
当表上的索引未覆盖where子句中的列时,因此在您的示例中,ProductID会在该列上创建统计信息,以创建直方图,以嗅探您提供的值的估计值,除非它已经有一个缓存的计划。
在执行计划中,您可以通过查看计划中SELECT对象(最左侧的对象)上的属性来查看引擎用于选择计划的统计信息。展开OptimizerStatsUsage属性。