Mik*_*may 0 sql-server statistics
我正在考虑在我的数据仓库中使用增量统计信息,但我读了Erin Stellato 的一篇文章,其中说查询优化器不使用增量统计信息。这篇文章写于 2015 年 5 月,但在接下来的 6 年里我没有看到任何人放弃她的立场。不同社区中有许多文章展示了如何设置它,但如果它没有用,为什么还要麻烦呢?有谁知道2016、2017、2019年的查询优化器后续版本是否支持使用增量统计?如果没有,我们是否应该使用它们?如果它们不能帮助引擎就如何查询包含 100 亿条记录的表做出正确的决定,那它有什么好处呢?感谢您的帮助!
据推测,您的旧分区不会频繁更改(或根本没有更改)。
您很烦恼,因为使用增量更新统计信息时,您只更新当前/活动分区,这减少了更新统计信息所花费的时间(Erin 在后续文章中讨论了这一点)。是的,这些被压扁并折叠成更大的直方图,是的,我也希望优化器现在能够使用它们。但可惜,事实并非如此。
如果您没有使用增量,您将更新整个 100 亿行表的统计信息(这需要更多时间),您获得了什么?大致相同的直方图。
它们对于分区消除(我希望这对您的 100 亿行表有用!)比对于最新分区内的基数更有用。
如果您想在单个分区内利用更多直方图步骤,您还可以维护过滤后的统计信息,也许仅在最活跃查询的分区上。(这些对于非分区表也很有用,其中 200/201 个步骤是不够的。)
WHERE <filter_predicate> 指定一个表达式,用于选择创建统计对象时要包含的行子集。使用过滤谓词创建的统计信息称为过滤统计信息。过滤谓词使用简单的比较逻辑,不能引用计算列、UDT 列、空间数据类型列或 HierarchyID 数据类型列。比较运算符不允许使用 NULL 文字进行比较。请改用 IS NULL 和 IS NOT NULL 运算符。
以下是 Production.BillOfMaterials 表的过滤谓词的一些示例:
WHERE StartDate > '20000101' AND EndDate <= '20000630'
Run Code Online (Sandbox Code Playgroud)
WHERE ComponentID IN (533, 324, 753)
Run Code Online (Sandbox Code Playgroud)
WHERE StartDate IN ('20000404', '20000905') AND EndDate IS NOT NULL
Run Code Online (Sandbox Code Playgroud)
有关过滤统计数据的一些信息:
| 归档时间: |
|
| 查看次数: |
198 次 |
| 最近记录: |