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

标签 sql performance oracle union union-all

如标题。

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

谢谢!

最佳答案

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

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

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

关于sql - 当我想消除重复记录时,Union all 和 union 应该使用哪一个?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16369973/

相关文章:

c++ - 如何优化 C++ avr 代码

javascript - 在性能方面,在一个页面上显示 1000 张图像的最佳方法是什么?

oracle - sql开发者: clear network alias list

Java 堆行为

Java 持久性 - getSingleResult() 未检索任何实体

c# - 如何在sqlbulkcopy中设置自动映射

sql - 如何使用 SQL Server 检查目录是否存在?

MySQL导出不带引号的CSV

sql - 查询显示与给定用户名匹配的相关用户名

c# - 为什么在这种情况下为 for 循环使用指针性能更高?