在UNION中排序

时间:2011-02-11 03:33:05

标签: sql oracle union

在oracle中,使用UNION连接两个表是否隐式排序数据?看起来确实如此,因为如解释计划窗口所示,它显示'SORT UNIQUE'。

我的问题只是:默认情况下,它按哪个或哪个列排序?

3 个答案:

答案 0 :(得分:8)

它确实需要强制执行唯一性,因此通常需要至少进行部分排序。 理论上,如果它可以通过另一种机制保证唯一性(例如,从分区键保证不重叠的指定分区中选择),它可能不会,但我还没有看到它的一个例子。

但是它不需要生成排序输出,因为它可以使用散列排序。也就是说,它将所有'A'字组合在一个桶中,所有'B'字在下一个桶中,依此类推。将对各个存储桶的内容进行排序,但查询可能会在“A”存储桶之前返回“B”存储桶的结果。

在9i和10g之间,Oracle修改了GROUP BY,因此它经常进行HASH SORT。结果很多人认为GROUP BY意味着排序输出是理所当然的。

答案 1 :(得分:4)

优化程序在执行uniongroup bydistinct等操作时有多种方法可确保唯一性。随着Oracle改进优化器,随着时间的推移,可能并且有望引入新方法。有时这是一种。但是不能保证它永远是一种排序,即使它今天使用了一种,它可能不会在明天。

如果需要输出排序,唯一的方法是保证带有order by子句。没有order by Oracle(以及任何SQL数据库)可以按任何顺序自由返回行。

答案 2 :(得分:0)

是的,为了删除重复项,隐式排序是因为UNION不包含UNION ALL等重复项,但是如果您希望在所有联盟之后使用ORDER BY保证排序,请确保得到所需的排序