ORDER BY句がない場合、行はどの順序でフェッチされますか?


11

1人のプログラマが、同じデータベース構造と同じデータを使用する同じアプリケーションを、Oracle 8とOracle 9の2つの異なるデータベースでのみテストおよび比較しています。

アプリは句なしで クエリを実行しますORDER BY

彼は、ORDER-BY-lessクエリは両方のデータベースで同じ順序で行を返すべきだと主張しています。

ORDER BY句を明示的に指定しない限り、同じ行順序の保証はないことを彼に伝えます。

データベースには同じインデックスとキーがあります。しかし、説明プランでは、データベースの1つではエンジンが結合テーブルの1つのキーを使用しているのに対し、他のデータベースでは別のデータベースのキーを使用していることを示しています。

彼は、2つのDB環境が等しくないことをほのめかしています。これは、統計やRDBMSエンジンなどが異なるためです。元のデータベースのすべてのインデックスを複製できなかったためではありません。

ORDER BY順序が本当に重要な場合は、明示的に条項を提供する必要があると彼に言います。

質問

だから私は彼をよりよく説明できます:

ORDER BY句を明示的に指定しない場合、クエリはどの順序で行をフェッチしますか?また、なぜそのクエリは同じ順序で行を返さないのですか?


3
未定義です。SQL仕様には、レコードが返される特定の順序が記載されているとは思わないため、実装に依存します。
ロバートハーヴェイ

1
@RobertHarveyそれがまさに彼に言った理由です。実際、定義上、リレーショナルテーブルには特定の順序を指定しないでください。
Tulainsコルドバ

1
データベースの正確なデータについて収集したインデックス統計に基づいてより選択的な場合があるため、まったく同じバージョンのソフトウェアでも異なるインデックスを使用することは理にかなっている場合があります。したがって、指定しないと、実際には順序に依存できません。
psr

インデックス化されていない列による最初のクエリは、「時間の挿入」の順序に従うことが現実的に期待できます。インデックス付きの「更新時間」によって。連続したリクエストは、キャッシュされた結果によって「汚染」される可能性が高いため、かなりランダム化されます。それにもかかわらず、決して依存することはありません-それはバージョンごとに、パラメータによって、更新操作によって、そして満月の悪天候によって変化するかもしれません。「未定義」が正しい答えであり、他の情報はせいぜい情報に基づいた推測です。
SF。

1
RDMBS-esによって返される結果セットは、それだけです。sets 、定義により特定の順序を持​​ちません。そのため、RDBMSは好きな順序でそれらを返し、次のクエリ実行で再び順序を変更できます。ORDER BY句なしで特定の注文に依存するのは間違いです。私はいつもこれを同僚に説明しようとしていますが、半分の時間しか成功していません:D。
ラドゥムルゼア

回答:


25

ウィキペディアから:

ORDER BY句は、結果のデータの並べ替えに使用される列と、並べ替える方向を指定します(オプションは昇順または降順です)。ORDER BY句がない場合、SQLクエリによって返される行の順序は未定義です。

それで未定義です。

SQL仕様には、レコードが返される特定の順序が記載されていないため、実装に依存します。

テーブルにインデックスがない場合、合理的な順序はレコードが挿入された順序になります。主キーが定義されている場合、賢明な順序は主キーの順序になります。ただし、ANSI仕様は特定の順序を必要としないため、ベンダー次第であり、その感度はお客様または私のものとは異なる場合があります。

順序は仕様に記載されていないため、特定のベンダーの実装の動作に依存することは賢明ではありません。ベンダーごとに異なる場合があり、ベンダーは警告なしにいつでも順序を変更できるためです。

先ほど言ったように、ORDER BY順序が重要な場合は、句を含めるだけです。


クエリにはいくつかの結合テーブルがあります。したがって、1つのDBエンジンは1つの基準で結果セットをソートし、他のDBは別の基準を使用しました。明らかに、ORDER BY句が指定されている場合、両方のクエリは指定された順序で行を返します。
Tulainsコルドバ

+1 AFAICRは、特定のデータベースインスタンスで特定のクエリを実行するたびに順序を変えることもできます。
MarkJ

2
ORDER BY句がなければ、合理的な結果の順序は、オーバーヘッドを最小限に抑えるものだけです。単純なDBストレージエンジンとクエリの場合、それは多くの場合、挿入順序になります(生成された主キーの場合は、主キーの順序と同じです)。しかし、そこにハッシュ結合があるとすぐに、順序は本質的にランダムになると思います。
マイケルボルグワード

2

明らかに、仕様ではデータの順序が示されておらず、機能していないことを指摘しています。おそらく、彼はデータがディスクまたはメモリのどこかにあることを知っていて、それを順序として持っているからでしょう。いくつかのテーブルから計算されたデータの順序を尋ねてください。つまり、4つのテーブルを結合し、2つのテーブルで計算を行い、計算された値のみを返す例を作成します。

エンジンは、データを検出した順序(順序なし)でデータを返しますが、その検出方法は、変更可能な要因(インデックス、統計、キャッシュ)に依存します。通常、データは一貫した順序になりますが、順序に依存する場合は、データを要求する必要があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.