我正在使用 SQL Server 2012 企业版。我遇到了一个 SQL 计划,它表现出一些我不觉得完全直观的行为。在大量并行索引扫描操作之后,发生并行(重新分区流)操作,但它正在杀死索引扫描(Object10.Index2)返回的行估计,将估计减少到 1。我做了一些搜索,但是没有遇到任何解释这种行为的东西。查询非常简单,尽管每个表都包含数百万的记录。这是 DWH 加载过程的一部分,这个中间数据集在整个过程中被触及了几次,但我遇到的问题尤其与行估计有关。有人可以解释为什么在 Parallelism (Repartition Strems) Operator 中准确的行估计会变为 1 吗?还,
我已将完整计划发布到粘贴计划。
这是有问题的操作:
包括计划树以防添加更多上下文:
我会遇到 Paul White 提交的这个 Connect 项目的一些变体吗(在他的博客上进一步深入解释)?至少它是我发现的唯一一个似乎与我遇到的情况很接近的东西,即使没有 TOP 操作员在玩。
带有位图过滤器的查询计划有时难以阅读。来自重新分区流的 BOL 文章(强调我的):
此外,关于位图滤镜的文章也很有帮助:
我相信这就是您在查询中观察到的。可以提出一个相对简单的演示来显示重新分区流运算符减少基数估计,即使位图运算符
IN_ROW
与事实表相反。资料准备:这是您不应该运行的查询:
我上传了计划。看看附近的运营商
inner_tbl_2
:您还可能会发现Paul White在Hash Joins on Nullable Columns中的第二个测试很有帮助。
在如何应用行缩减方面存在一些不一致。我只能在至少有三张桌子的计划中看到它。但是,使用正确的数据分布,预期行数的减少似乎是合理的。假设事实表中的连接列有许多在维度表中不存在的重复值。位图过滤器可能会在这些行到达连接之前消除它们。对于您的查询,估计值一直减少到 1。行在散列函数中的分布方式提供了一个很好的提示:
基于此,我怀疑您的
Object1.Column21
列有很多重复值。如果重复的列碰巧不在统计直方图中,Object4.Column19
那么 SQL Server 可能会得到非常错误的基数估计。我认为您应该担心可能会提高查询的性能。当然,如果查询满足响应时间或 SLA 要求,则可能不值得进一步调查。但是,如果您确实希望进一步调查,您可以做一些事情(除了更新统计信息)来了解如果查询优化器有更好的信息,它是否会选择更好的计划。您可以将连接的结果
Database1.Schema1.Object10
放入Database1.Schema1.Object11
临时表中,然后查看是否继续获得嵌套循环连接。您可以将该连接更改为 aLEFT OUTER JOIN
,这样查询优化器就不会在该步骤减少行数。您可以MAXDOP 1
在查询中添加提示以查看会发生什么。你可以使用TOP
连同派生表一起强制连接到最后,或者您甚至可以从查询中注释掉连接。希望这些建议足以让您入门。关于问题中的连接项,它与您的问题有关的可能性极小。这个问题与糟糕的行估计无关。它与并行的竞争条件有关,导致在后台的查询计划中处理太多行。在这里,您的查询似乎没有做任何额外的工作。
这里的核心问题是对第一次连接结果的基数估计很差。这可能由于许多原因而出现,但最常见的情况是统计数据过时或一些相关的连接谓词,优化器的默认模型假定它们是独立的。
在后一种情况下,修复:在 SQL Server 2008 或 SQL Server 2008 R2 或 SQL Server 2012 中运行包含相关 AND 谓词的查询时性能不佳可能与使用支持的跟踪标志 4137 相关。您也可以尝试使用查询跟踪标志 4199 以启用优化器修复,和/或 2301 以启用建模扩展。根据匿名计划很难知道。
位图的存在不会直接影响连接的基数估计,但它确实通过应用早期半连接减少使其效果更快可见。如果没有位图,第一次连接的基数估计将是相同的,并且计划的其余部分仍将相应地进行优化。
如果您好奇,在测试系统上,您可以使用跟踪标志 7498 禁用查询的位图。您还可以禁用优化位图(由优化器考虑并影响基数估计),用优化后位图替换它们(不考虑由优化器,对基数没有影响)与跟踪标志 7497 和 7498 的组合。两者都没有记录或支持在生产系统上使用,但它们确实产生优化器可以正常考虑的计划,因此可以强制使用计划指南。
这些都不能解决上面提到的第一次加入估计差的核心问题,所以我真的只是为了利益着想。
进一步阅读位图和哈希连接:
在 Twitter 上回复了你。我查看了附加的 XML,发现并行性不平衡。1 个线程几乎包含所有实际行,而其他大多数线程都没有。尖叫不平衡的并行性正在发生。因此,我会研究键/连接值及其各自的统计数据和基数。
根据您的其他想法,我不太确定 Connect 项是否适用,因为您粘贴的计划在我看到的任何地方都不包含 TOP。