【问题标题】:SQLServer's UNION has better performance than UNION ALL?SQLServer 的 UNION 性能比 UNION ALL 好?
【发布时间】:2012-09-05 04:48:28
【问题描述】:

我知道 UNION ALL 应该比 UNION 有更好的性能(参见:performance of union versus union all)。

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

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

谁能解释一下这种情况是怎么发生的???

谢谢,
齐夫

更新:
附加两个查询的执行计划(差异部分):

【问题讨论】:

  • 两种情况的执行计划都检查了吗?
  • @AndrásOttó 如何检索存储过程的执行计划?
  • @DorCohen:在 Management Studio 中运行 PRC,您可以获得图形执行计划(有一些图标可以执行此操作),更多信息您可以查看:msdn.microsoft.com/en-us/library/ms178071(v=sql.105).aspx跨度>
  • @AndrásOttó 我附上了两个查询的执行计划之间的差异
  • 你为什么说这样更好,如果你附上的图片中cpu cost和其他东西的信息完全一样?

标签: sql sql-server-2008 sql-server-2008-r2 database-performance query-tuning


【解决方案1】:

您引用了指向此article 的另一个主题。

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

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

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

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

DBCC FREEPROCCACHE
DBCC DROPCLEANBUFFERS 

这可以清除缓存,您可以在这两种情况下进行“冷运行”。你也可以在这里查看另一个article

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

差别还存在吗?

【讨论】:

  • 评论太多了,这就是为什么它是一个答案,但我有一种感觉,看到执行计划没有区别。
  • 我在测试前使用 dbcc 程序清除了缓存。奇怪的是,当我多次执行它时,差异消失了......如果我能找到其他任何东西,我会添加评论。
【解决方案2】:

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

我希望这会有所帮助。

【讨论】:

  • 我仔细检查了我的查询,它没有重复
  • 这对我来说似乎很奇怪。你的数据集中有很多 NULL 值吗?
  • 是的,每个部分都有很多NULL值
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多