列の順序が主キーと同じであるため、プロダクションクエリからorder by句を削除しようとしている同僚と最近話し合いをしました。
彼が主キーに基づく順序付けを保証できないことを説明しようとした長い議論の後、最終的な結論は、MSSQLクエリを変更するためにプッシュするつもりはなかったということでした。
しかし、彼はまだDB2クエリを変更する予定でした。
DB2が主キーでクエリを順序付けすることを証明する記事はすぐには見つかりませんでした。現在、それがそうであるかどうか疑問に思っています。
だから私の質問は、order by句がない場合、DB2はどのようにクエリを並べ替えるのですか?主キーを使用していますか?
並列システムで、order by句なしでデータが正しく順序付けられて出力されることをどのように保証できますか?
いいえ、あなたの同僚は間違っています。
すべてのSQL proroducts-SQL標準に従って動作するDBMS-に_ORDER BY
_句がない限りクエリ。
言語要素で説明されている比較規則に従って順序付けが行われます。 null値は他のすべての値よりも高くなります。順序指定で完全な順序が決定されない場合、最後に識別されたソートキーの値が重複する行は任意の順序になります。 _
ORDER BY
_を指定しない場合、結果テーブルの行は任意の順序になります
Ypercubeの回答で指摘されたように、 ORDER BY
句がない場合、定義された順序はありません 。
私が付け加えたいのは、SQLは非常に抽象的であり、DBMSが行うことを段階的に指定するのではなく、最終結果の要件を指定することを理解することが重要です。
これは、正しい順序を保証する方法でデータが既に検索されている場合、DBMSがそのような戦略を決定し、ORDER BY
の要件を満たすために追加の並べ替え作業が不要であることをすでに知っているためです。句。
一方、順序が重要であると指定しなかった場合(実際には重要ですか?)、DBMSはこれを考慮に入れ、適切なデータを見つけるのにより効率的な別の戦略を見つけた場合、他のいくつかの注文は、どうやら注文を気にしていないという事実を利用します。 (選択した戦略は、関連するテーブル、ソフトウェアパッチなどのデータ量の増加に基づいて、時間とともに非常によく変化する可能性があります。)
つまり、ORDER BY
句を削除しても、メリットはごくわずか(クエリサイズがわずかに小さい)ですが、順序が実際に重要な場合は、大きなデメリットになる可能性があります。特に、これはテストデータセットで非常にうまく機能し、受け入れテストを通過して、将来深刻な問題を引き起こす可能性があるためです。