ORDER BY を指定しない時 / SELECT結果表示並び順 の法則性

投稿者: Anonymous

MySQL で ORDER BY を指定しない時、SELECT結果並び順 の法則性に関するドキュメントは公開されているでしょうか?

・必要なら、ORDER BY を 指定した方がよいとは思うのですが、指定しない場合は、どういう基準で、並び順を決定しているのでしょうか?
・インデックスは関係する?
・バージョンによって異なる?
・それに関する資料はどこかにない?


質問背景を追記しました。

・単なる興味本位です
・ORDER BY を 指定しない場合、MySQL はどういう思考に基づいて処理を行うのか、そこには一定の法則があると思うのですが、そこを開示していないのかな、と思いました
(オープンソースだけど、処理内容を読み解くことは実質的に不可能?)
・また、標準SQLで、「ORDER BY を指定しない」場合の取り扱いについて具体的にどう言及しているか、について知りたかったです

解決

SQLの仕様上SELECTで取得できる列の並びが保証されているのはORDER BYが指定されている場合のみです。指定されていない場合の挙動は仕様には定義されていないので、実装依存となります。

そこで実装側を考えると、一定の並びを保証するということはその通りに並び替えるコストが生じることになりますので、ORDER BYを指定しないというのは利用者からすれば余計な処理はするなという意思表示でもあります。従って多くの実装ではORDER BYが指定されない場合は特別に並び替えをしません。

したがって、

指定しない場合は、どういう基準で、並び順を決定しているのでしょうか?

という疑問への答えは、「並び順を決定していない」となります。

実際に列の順番がどうなるかはストレージ上の並びかもしれませんしインデックス順かもしれません。実行計画によっても変わるでしょうからエンジンのバージョンにって変わるのも当然あり得ることです。

具体的な記述としては以下のようなものがありました。

JIS X 3005-2:2010 4.14.2にはこう書かれています。

問合せ式によって指定される表の行の順序付けは,ORDER BY 句を直に含む問合せ式に対してだけ保証される。

こちらのSQL99の解説書には以下の記述があります。

An ORDER BY clause may optionally appear after a : it specifies the order rows should have when returned from that query (if you omit the clause, your DBMS will return the rows in some random order).

実装側だと、PostgreSQLのマニュアル

ORDER BYが指定されない場合は、システムが計算過程で見つけた順番で行が返されます

回答者: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *