Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 当我想要消除重复记录时,我应该使用Union all和Union中的哪一个?_Sql_Performance_Oracle_Union_Union All - Fatal编程技术网

Sql 当我想要消除重复记录时,我应该使用Union all和Union中的哪一个?

Sql 当我想要消除重复记录时,我应该使用Union all和Union中的哪一个?,sql,performance,oracle,union,union-all,Sql,Performance,Oracle,Union,Union All,作为标题 我已经看到,人们都说我们应该首先考虑工会,我的问题是我应该用哪一个来消除重复的记录。 我看到开发人员使用union all首先搜索记录,然后在项目源代码中用Java过滤重复记录,这有必要吗??在这种情况下,工会是更好的选择吗 谢谢 在过去(90年代中期),一些RDBMS引擎对UNION的实现非常差,因此建议切换到UNION-ALL并在客户端上进行过滤通常是有回报的。然而,UNION的性能已经过优化,因此,对于现代RDBMS,必须根据具体情况做出决定: 当您执行联合时,数据库必须为您消

作为标题

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

谢谢

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

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

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

根据SQL规范:

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



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

谢谢!!!!!!!!!!!!!!!!!!!!!!!!