web-dev-qa-db-ja.com

Oracleの選択クエリのデフォルトの行順序

Oracleでは、「order by」句が指定されていない場合の選択クエリの行のデフォルトの順序は何ですか。

それは...ですか

  1. 行が挿入された順序
  2. デフォルトの順序付けはまったくありません
  3. 上記のどれでもない。
42
sengs

Tom Kyteによれば、「クエリに「order by」を追加しない限り、返される行の順序については何も言うことができません。

Asktom.comで この質問 を参照してください。

ROWNUMに関しては、物理的には存在しないため、「解放」できません。 ROWNUMは、レコードがテーブルから取得された後に割り当てられるため、「WHERE ROWNUM = 5」は常にレコードの選択に失敗します。

@ammoQ:GROUP BYの順序について このAskTomの記事 を読みたいかもしれません。要するに:

Query ByのGroup By句は、Order By句がない場合でも、出力データがGroup By列で順番にソートされることを保証しますか?

そして我々は言った...

絶対違う、

決して持っていないし、決してしなかったし、決してしなかった。

42
DCookie

明示的なデフォルトの順序付けはありません。明らかな理由により、新しいテーブルを作成し、いくつかの行を挿入し、「where」句なしで「select *」を実行すると、挿入された順序で行を返します(ほとんどの場合)。

ただし、発生するデフォルトの順序に決して依存しないでください。特定の順序が必要な場合は、「order by」句を使用します。たとえば、9iまでのOracleバージョンでは、「group by」を実行すると、行がグループ式でソートされます。 10gでは、この動作はもう存在しません!このため、Oracleインストールのアップグレードにより、いくつかの作業が発生しました。

21

ORDER BY句を指定しない場合、Oracleは任意の順序で行を提供できると既に述べています。 ORDER BY句を指定しない場合の順序を推測することは無意味です。そして、あなたのコードでこれに依存することは、「キャリアを制限する動き」です。

簡単な例:

SQL> create table t as select level id from dual connect by level <= 10
  2  /

Tabel is aangemaakt.

SQL> select id from t
  2  /

        ID
----------
         1
         2
         3
         4
         5
         6
         7
         8
         9
        10

10 rijen zijn geselecteerd.

SQL> delete t where id = 6
  2  /

1 rij is verwijderd.

SQL> insert into t values (6)
  2  /

1 rij is aangemaakt.

SQL> select id from t
  2  /

        ID
----------
         1
         2
         3
         4
         5
         7
         8
         9
        10
         6

10 rijen zijn geselecteerd.

そして、これは単純なdelete + insertの後のみです。そして、考えられる他の多くの状況があります。並列実行、パーティション、インデックス化されたテーブルなどをいくつか挙げます。

最下行は、ammoQで既によく言われているように、行を並べ替える必要がある場合は、ORDER BY句を使用します。

5
Rob van Wijk

order byを指定しない限り、確実に順序に依存することはできません。特にOracleの場合、実際にはまったく同じクエリ(結合なし)が見られ、その間に数秒以内に2回実行され、一時的に変更されなかったテーブルで、大幅に異なる順序を返します。これは、結果セットが大きい場合に発生する可能性が高くなります。

Rob van Wijkが言及した並列実行がおそらくこれを説明しています。 Oracleの sing Parallel Execution docも参照してください。

3
Kelvin