当我想消除重复记录时,我应该使用Union all和union?

时间:2013-05-04 02:25:30

标签: sql performance oracle union union-all

作为标题。

我见过this,所有人都说我们应该首先考虑联合表演,我的问题是当我想要消除重复记录时应该使用哪一个。 我已经看到开发人员使用union all首先搜索记录,然后在我们项目的源代码中用Java过滤重复记录,这是必要的吗?对于这种情况,联盟是否会是更好的选择?

谢谢!

2 个答案:

答案 0 :(得分:2)

在过去(九十年代中期),一些RDBMS引擎的UNION实现非常糟糕,因此建议切换到UNION ALL并在客户端上进行过滤通常会得到回报。然而,UNION的性能已得到优化,因此对于现代RDBMS,必须根据具体情况做出决定:

  • 执行UNION时,数据库必须为您删除重复项。如果从查询返回的记录数量很少(比如几百到一千),那么消除重复项的位置无关紧要,所以你不妨在RDBMS方面这样做。
  • 当记录数量达到数万时,您可以通过利用数据的特定属性,以比RDBMS更聪明的方式消除重复项。在这种情况下,您将使用UNION ALL
  • 如果行数很大且重复项的份额非常大(例如,来自五个表的UNION ALL,其中70%的行是重复的),那么节省网络带宽可能会更好通过让RDBMS消除重复数据来减少客户端内存,并将要传输回数据的数据减少70%。

总而言之,没有普遍的情况。在做出某种决定之前,您需要进行一些计算并对查询进行概要分析。

答案 1 :(得分:0)

根据SQL规范:

  • UNION ALL返回所选订单中的所有行
  • UNION删除重复项,但行顺序是任意的(通常是排序的)

因此请使用UNION删除重复项。


如果可以的话,你应该避免UNION的原因是删除重复项的典型方法是数据库对结果集进行排序。排序可能很昂贵,特别是对于大型结果集。