「orderby」値が同一の場合、Oracleが特定のシーケンスを返すのはなぜですか?

oracle sql-order-by
「orderby」値が同一の場合、Oracleが特定のシーケンスを返すのはなぜですか?

一見ランダムな順序で返される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の順序で返されます。

これは私を怒らせているので、誰かがこれがなぜであるかについての説明を提供できれば、それは本当に私を落ち着かせるのに役立つでしょう。

順序の条件がすべての行で同一であるため、クエリが実行されるたびに異なる順序でこれが返されることを期待します(したがって、順序は純粋なチャンスに任されます)。

事前に感謝します。

  7  0


ベストアンサー

順序は「純粋なチャンス」までではありません-クエリを次のように修正しない限り:

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

順序は「任意」です。 任意の順序を決定するために「サイコロを投げる」のではなく(これにより不必要なコストが発生します)、Oracleはデータを検出した順序で返します。 (長期的には、環境内で何かが変更されて順序が異なる場合がありますが、それでも任意です。)

10


私はOracleの実装について何も知りませんが、すべてが等しい場合、優先的に、それらはランダムな順序にはなりません:それらをランダムな順序に配置するには、毎回そこにランダム化する必要があります(n nがアイテムの数であるランダム化操作(大きなO表記を使用するとO(n)になります)。これは、クエリが膨大な(数百万)結果を返す場合、計算負荷の高いものです。

クエリによって返されました

このようにランダム化する必要はありません。

代わりに、ディスクに保存されている順序で(それらが推測しているとおりに)返すだけです

2


注文に関するTom Kyteのブログのhttp://tkyte.blogspot.com/2005/08/order-in-court.html[this nice piece]を読んでください。

行が「1,3,2」の順序で戻ってきたと言うとき、それを修正するために列が1,3,2の順序であることを伝える列で並べ替える必要があります。

2


Oracleのようなサウンドは、ソートを行うためにhttp://en.wikipedia.org/wiki/Sorting_algorithm#Stability[stable]ソートアルゴリズムを使用します。

-1


タイトルとURLをコピーしました