Oracle では、「order by」句が指定されていない場合の選択クエリの行のデフォルトの順序は何ですか。
それは...ですか
- 行が挿入された順序
- デフォルトの順序付けはまったくありません
- 上記のどれでもない。
Oracle では、「order by」句が指定されていない場合の選択クエリの行のデフォルトの順序は何ですか。
それは...ですか
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.
そして、これは単純な削除+挿入の後でのみです。そして、考えられる他の多くの状況があります。ほんの数例を挙げると、並列実行、パーティション、インデックス編成テーブルなどがあります。
結論として、すでに ammoQ が非常によく言っているように、行を並べ替える必要がある場合は、ORDER BY 句を使用します。
を指定しない限り、絶対に、確実に順序付けに依存することはできませんorder by
。特にOracleの場合、実際にはまったく同じクエリ(結合なし)が、その間に変更されなかったテーブルで数秒以内に2回実行され、大幅に異なる順序を返すのを見てきました。これは、結果セットが大きい場合に発生する可能性が高くなります。
Rob van Wijk が言及した並列実行は、おそらくこれを説明しています。Oracle のUsing Parallel Executionに関するドキュメントも参照してください。
インデックスの影響を受けます。インデックスがある場合は昇順を返し、インデックスがない場合は挿入された順序を返します。
Oracle の非表示の Rownum 属性を使用していると思います。
したがって、後で使用するために行番号を解放した可能性のある削除が行われなかったと仮定すると、おそらくあなたの #1 は正しいでしょう。
編集:他の人が言ったように、これに頼るべきではありません。削除以外にも、デフォルトの並べ替え動作に影響を与えるさまざまな条件が多数あります。