我知道UNION ALL应该比UNION具有更好的性能(参见:performance of union versus union all)。
现在,我有了这个庞大的存储过程(有很多查询),其中最后的结果是两部分SELECT,它们之间有一个UNION。由于两个数据集彼此都是外来的,我可以使用UNION ALL,它假设更好(没有明显的操作)。
我在几个数据库上检查它并且运行正常。问题是我的一个客户给我他的数据库进行性能调整,当我调查它时,我注意到如果我将UNION ALL更改为UNION,性能会更好(!)。这是我在存储过程中所做的所有改变。
有人可以解释一下这种情况会怎样?
谢谢,
谢夫
更新
两个查询的附加执行计划(差异部分):
答案 0 :(得分:1)
您引用了另一个指向此article的主题。
如果你检查这个,这里有两个不同的执行计划。最大的区别是Distinct Sort
使得表现更差。
在您的示例中,两个执行计划与物理操作Merge Join具有相同的步骤(仅逻辑操作不同)。甚至估计都是一样的。
现在我真的是courios:两个查询之间的区别有多大?
如果您没有执行以下操作,请再次重复测试:
1)在运行PRC之前使用以下行:
DBCC FREEPROCCACHE
DBCC DROPCLEANBUFFERS
这使得缓存清晰,你可以在两种情况下进行“冷运行”。您也可以在此处查看其他article。
2)重复跑几次以查看平均值。
差异是否仍然存在?
答案 1 :(得分:0)
如果您有一些重复的行,则会发生这种情况。 UNION语句有效地对结果集执行SELECT DISTINCT。如果您知道返回的所有记录都是您的联合中唯一的,请使用UNION ALL,因为它可以提供更快的结果。但是,对于你的情况下的重复,我猜想有足够数量的重复,以使UNION更快 - 你可以测试这个重复计数并删除它们。然后运行UNION ALL可能会回归“赢家”......
我希望这会有所帮助。