5

我知道 UNION ALL 应该比 UNION 具有更好的性能(请参阅:union 与 union all 的性能)。

现在,我有这个巨大的存储过程(有很多查询),其中最终结果是两个部分的 SELECT,它们之间有一个 UNION。由于两个数据集彼此都是陌生的,我可以使用 UNION ALL 假设更好(没有不同的操作)。

我已经在几个数据库上检查过它,它工作正常。问题是我的一个客户给了我他的数据库进行性能调整,当我调查它时,我注意到如果我将 UNION ALL 更改为 UNION,性能会更好一些(!)。这就是我在存储过程中所做的所有更改。

有人可以解释一下这种情况是如何发生的吗???

谢谢,
齐夫

更新:
附加两个查询的执行计划(差异部分): 在此处输入图像描述

4

2 回答 2

1

您引用了指向本文的另一个主题。

如果你在这里检查这个是两个不同的执行计划。最大的区别是Distinct Sort性能更差。

在您的示例中,两个执行计划与物理操作 Merge Join 具有相同的步骤(仅逻辑操作不同)。甚至估计都是一样的。

现在我真的很好奇:这两个查询之间的差异有多大?

如果您没有执行以下操作,请再次重复您的测试:
1)在运行 PRC 之前使用以下行:

DBCC FREEPROCCACHE
DBCC DROPCLEANBUFFERS 

这使缓存清晰,您可以在这两种情况下进行“冷运行”。您也可以在此处查看另一篇文章

2) 重复运行几次以查看平均值。

差别还存在吗?

于 2012-09-12T10:18:37.610 回答
0

如果您有一些重复的行,就会发生这种情况。UNION 语句有效地对结果集执行 SELECT DISTINCT。如果您知道返回的所有记录在您的联合中都是唯一的,请使用 UNION ALL,因为它可以提供更快的结果。但是,对于您的情况下的重复项,我猜想有足够数量的重复项可以使 UNION 更快 - 您可以测试这个计数重复项并删除它们。然后运行 ​​UNION ALL 可能会重新成为“赢家”......

我希望这有帮助。

于 2012-09-12T08:07:26.040 回答