统计数据是SQL Server用来确定如何获取数据的可行性。
比方说,你有一个只有主键上有聚集索引的表。当您执行SELECT * FROM tablename WHERE col1=value
时,SQL Server只有一个选项,用于扫描表中的每一行以查找匹配的行。
现在我们在col1上添加一个索引,以便您假定SQL Server将使用索引来查找匹配的行,但事实并非如此。假设表格有200,000行,col1
只有2个值:1和0.当SQL Server使用索引查找数据时,索引包含指向聚簇索引位置的指针。鉴于索引列中只有两个值,SQL Server认为只需扫描表是更合理的,因为使用索引会更有效。
现在我们再向表中添加800,000行数据,但是这次col1
中的值差别很大。现在这是一个有用的索引,因为SQL Server可以可靠地使用索引来限制它需要从表中提取的内容。 SQL Server会使用索引吗?
这取决于。统计数据依赖于什么。在某个时间点,设置AUTO UPDATE STATISTICS
,服务器将更新索引的统计信息,并知道这是一个非常好的有效索引。然而,在那之前,它会忽视索引作为不相关的。
这是统计的一种用法。但还有另外一种用途,那与指数无关。 SQL Server保留有关表中所有列的基本统计信息。如果有足够的不同数据使其值得,那么SQL Server实际上会在列上创建一个临时索引并用它来过滤。虽然这比使用现有索引需要更多的时间,但比全表扫描花费的时间更少。
有时,您会得到建议以创建对该列有用的列的特定统计信息。这些不是索引,但是会跟踪列中数据的统计抽样,因此SQL Server可以确定创建临时索引以返回数据是否合理。
HTH
“服务器将更新索引的统计信息,并知道这是用一个非常良好的,有效的指标” - 依据是什么?何时该索引被确定为无效使用? – BornToCode 2016-06-19 10:09:18