2011-02-11 43 views
2

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

我的问题只是:默认情况下,按其列或排列方式排列?

回答

0

是排序是为了去除重复,因为UNION不包括像UNION ALL重复隐含的,但是如果你想有一个保证排序使用ORDER BY所有工会之后,以确保你得到所需的排序

+2

所以这意味着无法使用Order by,没有默认的列或进程结果排序?因为我认为它是使用你的select语句的排列来排序的,就像它先用你检索到的第一列进行排序,然后是其他的排序。我在想这个问题吗? – Jenny 2011-02-11 03:45:55

+0

-1“是的排序是隐式的,以删除重复项”优化器可能决定使用散列表来删除重复项。 – 2011-02-11 05:37:13

+0

@珍妮:是的,你错了。如果没有`order by`命令,数据库可以按任意顺序返回行,并且不保证每次都会以相同的顺序返回它们。你可以为自己验证前面的声明:尝试`从字典中选择table_name(或任何其他可调整的系统表)。 – Allan 2011-02-11 18:36:02

8

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

但是它不需要生成排序输出,因为它可以使用散列排序。也就是说,它将所有'A'字放在一个桶中,所有'B'字放在下一个等等。单个桶的内容将被排序,但是查询可以在'A'桶之前返回'B'桶的结果。

在9i和10g之间,Oracle修改了GROUP BY,因此它经常做一个HASH SORT。因此,许多认为GROUP BY意味着排序产量的人被赶出去了。

4

优化器在执行诸如uniongroup bydistinct之类的事情时有各种确保唯一性的方法。随着Oracle对优化器的改进,随着时间的推移,新的方法可能会被引入。有时候这是一种。但没有保证它总是会是一种,即使它今天使用一种,它可能不是明天。

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