【问题标题】:which one should i used of Union all and union when i want to eliminate the duplicate records? [closed]当我想消除重复记录时,我应该使用 Union all 和 union 哪一个? [关闭]
【发布时间】:2013-05-04 02:25:30
【问题描述】:

作为标题。

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

谢谢!

【问题讨论】:

    标签: sql performance oracle union union-all


    【解决方案1】:

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

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

    总而言之,没有通用的场景。在以一种或另一种方式做出决定之前,您需要进行一些计算并分析您的查询。

    【讨论】:

      【解决方案2】:

      根据 SQL 规范:

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

      所以使用UNION 删除重复项。


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

      【讨论】:

      • 谢谢!!!!!!!!!!!!!!!!!!!!!!!!!!!
      猜你喜欢
      • 2023-03-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多