什么是数据库统计信息,我如何从中受益?


18

我听说过SQL Server默认保留的统计信息。他们跟踪的是什么,如何使用此信息来改进数据库?

Answers:


21

统计信息只是动态元数据的一种形式,可帮助查询优化器做出更好的决策。例如,如果一个表中只有十几行,那么就没有必要去索引进行查找了。进行全表扫描始终会更好。但是,如果同一张表增长到一百万行,那么使用索引可能会更好。但是,如果您在只有很少的唯一值的列上查询该表(例如,它可能是仅包含“ M”或“ F”的“性”列),那么实际上FTS可能会比这种情况更好,因为您会无论如何都需要检索该块以构建结果集。现在说您的表是99%的“ M”,而只有1%的“ F”,我们应该在一种情况下使用FTS或在另一种情况下使用索引。相同的表,相同的查询,根据表的内容,可能有四个不同的查询计划。这些都是“统计信息”,它们对于每个数据库都是独立的-即使具有相同表和索引结构的两个数据库也将具有不同的统计信息。

总而言之,在现代数据库引擎中,有两种查询优化:重写SQL(基于规则的优化,就像编译器重写C以使其更高效),以及选择正确的数据路径(基于成本的优化) ,例如JIT编译器在运行时识别热点)。如果发现查询优化器明显做错了事情(例如,当您知道索引会更好时选择FTS),则只需担心这一点。


2
+1我再也无法解释了。重要的是要记住,统计信息只有在保持最新状态时才有用。这可以通过自动更新统计信息或定期计划的(每晚/每周)更新统计信息命令来完成。同样,索引重建将自动执行统计信息更新。
Matt M

5

它们使用的查询优化器(白皮书MSDN上)来跟踪在索引和/或列中的值的分布。

唯一需要关心的是应该定期更新:只需让数据库引擎来完成它的工作


2
不总是。有时手动创建统计信息可以帮助提高查询性能。
mrdenny

@mrdenny:您在现实生活中多久这样做一次?非常稀有。我没有IIRC。如果它需要统计数据,则可以说它需要一个索引,该索引仍然具有统计信息。您只能根据CREATE STATISTICS创建列统计信息。鉴于OP必须询问统计信息,所以我认为这是一件公平的事情。
gbn

1
我已经做过几次,但不是经常。我反对您的“您唯一需要关注的是应该定期更新”的说法,因为更新统计信息不是唯一的事情。
mrdenny
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.