【发布时间】:2013-05-04 02:25:30
【问题描述】:
作为标题。
我见过this,人们都说我们应该首先考虑联合所有的性能,我的问题是当我想消除重复记录时我应该使用哪个。 我看到开发者使用union all先搜索记录,然后在我们项目的源代码中通过Java过滤重复记录,有必要吗?对于这种情况,工会会是更好的选择吗??
谢谢!
【问题讨论】:
标签: sql performance oracle union union-all
作为标题。
我见过this,人们都说我们应该首先考虑联合所有的性能,我的问题是当我想消除重复记录时我应该使用哪个。 我看到开发者使用union all先搜索记录,然后在我们项目的源代码中通过Java过滤重复记录,有必要吗?对于这种情况,工会会是更好的选择吗??
谢谢!
【问题讨论】:
标签: sql performance oracle union union-all
在过去(九十年代中期),一些 RDBMS 引擎对 UNION 的实现非常差,因此建议切换到 UNION ALL 并在客户端上进行过滤通常得到了回报。不过,UNION 的性能已经过优化,因此对于现代 RDBMS,必须根据具体情况做出决定:
UNION 时,数据库必须为您消除重复项。如果从查询返回的记录数很少(例如,几百到一千),那么在哪里消除重复项并不重要,因此您不妨在 RDBMS 端进行。UNION ALL。UNION ALL 来自五个表,其中 70% 的行是重复的)可能会更好地节省网络带宽和客户端通过使用 RDBMS 消除重复内存,并将要传输回给您的数据大小减少 70%。总而言之,没有通用的场景。在以一种或另一种方式做出决定之前,您需要进行一些计算并分析您的查询。
【讨论】:
根据 SQL 规范:
UNION ALL 按选定顺序返回所有行UNION 删除重复项,但行顺序是任意的(通常是排序的)所以使用UNION 删除重复项。
如果可以,您应该避免使用 UNION 的原因是,删除重复项的典型方法是让数据库对结果集进行排序。排序可能很昂贵,尤其是对于大型结果集。
【讨论】: