SQL Server统计信息

14

对于这个项目,我们有一些查询会定期执行(每分钟左右)。我使用“在数据库引擎中分析查询”来检查它们。

它们非常简单: select * from tablex where processed='0'

在processed上有一个索引,并且每个查询应在具有1百万条记录的表上返回<1000行。

分析器建议在此上创建一些统计信息....所以我的问题是:这些统计信息是什么?它们真的有助于性能吗?对于像上面那样的表来说,它们的成本如何?

请注意,我绝不会称自己为SQL Server经验丰富的用户...这是第一次使用这个分析器。

2个回答

24

统计数据是 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 可以确定是否有意义创建一个临时索引来返回数据。

希望对您有所帮助。


0
在 Sql Server 2005 中,设置自动创建统计信息和自动更新统计信息。您不必担心自己创建或维护它们,因为数据库可以很好地处理它们。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接