【发布时间】:2019-06-14 09:23:47
【问题描述】:
在 SQL Server 中,创建索引会自动为该索引创建统计对象,并使用它来决定最佳查询执行计划。
此外,会自动为 WHERE 子句中使用的列创建统计对象 - 例如:
SELECT *
FROM AWSales
WHERE ProductID = 898
上面的查询会自动为 ProductID 创建一个统计对象。这有什么用?
既然非索引列是未排序的,而且它也不是 B 树结构,那么统计信息如何帮助选择比表扫描更好的查询计划?
我认为统计的目的是让引擎选择是否使用索引;以及是否使用搜索或扫描。我缺少什么知识?
【问题讨论】:
-
了解查询运算符是否将返回 1 或 100 万行(或这些行的 10 或 1000 个不同的值)是很有用的,而不管如何使用索引来选择数据。例如,决定使用散列连接、循环连接还是合并连接以及为结果集保留多少内存至关重要。对于这个特定的查询,统计数据可能没有用,但它们通常非常有用(并且足够便宜,可以通过抽样产生),优化器会继续创建它们。在编译时对统计数据做出决定会复杂得多。
标签: sql-server indexing