查询优化器是否使用增量统计?

Mik*_*may 0 sql-server statistics

我正在考虑在我的数据仓库中使用增量统计信息,但我读了Erin Stellato 的一篇文章,其中说查询优化器不使用增量统计信息。这篇文章写于 2015 年 5 月,但在接下来的 6 年里我没有看到任何人放弃她的立场。不同社区中有许多文章展示了如何设置它,但如果它没有用,为什么还要麻烦呢?有谁知道2016、2017、2019年的查询优化器后续版本是否支持使用增量统计?如果没有,我们是否应该使用它们?如果它们不能帮助引擎就如何查询包含 100 亿条记录的表做出正确的决定,那它有什么好处呢?感谢您的帮助!

Aar*_*and 5

据推测,您的旧分区不会频繁更改(或根本没有更改)。

您很烦恼,因为使用增量更新统计信息时,您只更新当前/活动分区,这减少了更新统计信息所花费的时间(Erin 在后续文章中讨论了这一点。是的,这些被压扁并折叠成更大的直方图,是的,我也希望优化器现在能够使用它们。但可惜,事实并非如此。

如果您没有使用增量,您将更新整个 100 亿行表的统计信息(这需要更多时间),您获得了什么?大致相同的直方图。

它们对于分区消除(我希望这对您的 100 亿行表有用!)比对于最新分区内的基数更有用。

如果您想在单个分区内利用更多直方图步骤,您可以维护过滤后的统计信息,也许仅在最活跃查询的分区上。(这些对于非分区表也很有用,其中 200/201 个步骤是不够的。)

文档CREATE STATISTICS

WHERE <filter_predicate> 指定一个表达式,用于选择创建统计对象时要包含的行子集。使用过滤谓词创建的统计信息称为过滤统计信息。过滤谓词使用简单的比较逻辑,不能引用计算列、UDT 列、空间数据类型列或 HierarchyID 数据类型列。比较运算符不允许使用 NULL 文字进行比较。请改用 IS NULL 和 IS NOT NULL 运算符。

以下是 Production.BillOfMaterials 表的过滤谓词的一些示例:

有关过滤统计数据的一些信息: