如果'orderby'值相同,为什么Oracle会返回特定的序列?

时间:2010-10-11 14:32:49

标签: oracle sql-order-by

我对Oracle中的查询感到困惑,该查询以看似随机的顺序返回。

SELECT
  Date,
  Amount
FROM MyTable
WHERE Date = '26-OCT-2010'
ORDER BY Date

这将返回以下数据:

   |  Date       |  Amount
--------------------------
1  |  26-OCT-10  |  85
2  |  26-OCT-10  |  9
3  |  26-OCT-10  |  100

我无法理解为什么数据库会按照这个特定的顺序返回数据,或者为什么,因为原始表会以这种方式返回数据。

Date投射到TIMESTAMP确认所有Date值都是相同的值 - 26-OCT-10 00.00.00.000000000,因此,我可以排除这些值存在差异。但是,当我这样做时,行返回的顺序为1,3,2。

这让我很生气,所以如果有人可以解释为什么会这样,那真的有助于安抚我。

我希望每次运行查询时都会以不同的顺序返回,因为条件的条件在每一行都是相同的(因此排序很简单)。

非常感谢提前。

4 个答案:

答案 0 :(得分:10)

排序不是“纯粹的机会” - 除非您将查询修改为:

SELECT
  Date,
  Amount
FROM MyTable
WHERE Date = '26-OCT-2010'
ORDER BY Date, DBMS_RANDOM.VALUE;

排序是“任意的”。而不是“掷骰子”来决定任意顺序(这将导致一些不必要的成本),Oracle只是按照它遇到的顺序返回数据 - 从短期运行到运行可能是相同的。 (从长远来看,环境中的某些东西可能会发生变化,使得排序不同 - 但仍然是随意的。)

答案 1 :(得分:2)

虽然我对Oracle的实现一无所知,但如果所有条件都相同,那么它们就不会是随机顺序:将它们按随机顺序排列则需要每次都按顺序进行排序(将是n随机化操作,其中n是项目数(使用大O表示法,它将是O(n)),如果查询将返回巨大(数百万)结果,这是计算上昂贵的事情。

由查询返回

没有必要以这种方式随机化,。

相反,它只是将它们返回(我猜的是)它们存储在磁盘上的顺序

答案 2 :(得分:2)

阅读Tom Kyte博客中关于订购的this nice piece

当你说行以“1,3,2”顺序返回时,你应该按照那些告诉你它以1,3,2顺序修复它的列进行排序。

答案 3 :(得分:-1)

听起来像Oracle使用stable排序算法进行排序。