1人のプログラマが、同じデータベース構造と同じデータを使用する同じアプリケーションを、Oracle 8とOracle 9の2つの別々のデータベースでのみテストおよび比較しています。
アプリはnoORDER BY
句を使用してクエリを実行します。
ORDER-BY-lessクエリは両方のデータベースで同じ順序で行を返す必要があると彼は主張しています。
同じ行順序の保証はないことを彼に伝えます明示的にORDER BY句を提供しない限り
データベースのインデックスとキーは同じです。しかし、Explain計画は、データベースの1つではエンジンが結合されたテーブルの1つのキーを使用しているのに対し、他のデータベースでは別のデータベースのキーを使用していることを示しています。
彼は2つのDB環境が等しくないことをほのめかしています。これは、統計やrdbmsエンジンなどが異なるためですが、元のデータベースが持つすべてのインデックスを複製できなかったためではありません。
注文が本当にそれほど重要な場合は、明示的にORDER BY
句を提供する必要があると彼に伝えます。
だから私は彼をよりよく説明することができます:
明示的にORDER BY句を指定しない場合、クエリはどの順序で行をフェッチし、なぜそのクエリは同じ順序で行を返さないのですか?
Wikipedia から:
ORDER BY句は、結果のデータをソートするために使用される列と、それらをソートする方向を識別します(オプションは昇順または降順です)。 ORDER BY句がない場合、SQLクエリによって返される行の順序は定義されません。
したがって、未定義です。
SQL仕様には、レコードが返される特定の順序が記載されていないため、実装に依存します。
テーブルにインデックスがない場合、適切な順序は、レコードが挿入された順序になります。主キーが定義されていると、適切な順序は主キーの順序になります。しかし、ANSI仕様は特定の順序を必要としないため、ベンダー次第であり、それらの感度はユーザーや私のものとは異なる場合があります。
順序は仕様に記述されていないので、ベンダーによって異なる可能性があるため、特定のベンダーの実装の動作に依存することは賢明ではありません。警告なしに、いつでも順序を変更できます。
あなたが言ったように、ORDER BY
句(順序が重要な場合)。
仕様がデータが入ってくる順番を述べていないことを明らかに指摘し、機能していません。おそらく彼は知っているデータがディスクまたはメモリのどこかにあり、したがってそれを順序として持っているためです。いくつかのテーブルから計算されたデータの順序を彼に尋ねます。つまり4つのテーブルを結合し、そのうちの2つで計算を行い、計算された値のみを返す例を作成します。
エンジンはデータを見つけた順序で返します(order byがない場合)が、それを見つける方法は、変更可能な要因(インデックス、統計、キャッシュ)によって異なります。通常、データは一貫した順序になりますが、順序に依存している場合は、それを要求する必要があります。