- PR -

Select結果のソート順について

1
投稿者投稿内容
hs25186
会議室デビュー日: 2005/08/01
投稿数: 5
投稿日時: 2005-11-25 20:29
Oracle9iを使用しています。

Select文にてOrderBy句を使用せずに複数レコードを抽出する際、そのソート順は何順になるのでしょうか?
RowID順なのかなとも思いますが、その場合、必ずRowID順になるということがOracleでは保証されているのかどうかも知りたいです。

また同様に、複数回Insertを繰り返す場合、RowIDは必ず昇順にカウントアップされていくのでしょうか?

ご存知の方いらっしゃいましたら宜しくお願い致します。
あしゅ
ぬし
会議室デビュー日: 2005/08/05
投稿数: 613
投稿日時: 2005-11-26 17:14
件名:最終行にinsertされない?

ついこないだほとんど同じ話題出てましたよ。
明示的にソートしない限り順序は仮定すべきではないです。
Desmo
大ベテラン
会議室デビュー日: 2004/03/24
投稿数: 149
投稿日時: 2005-11-28 16:34
OracleはSELECT文発行時に実行計画を立て、効率の良い順序でデータを読み込んできますので、(hs25186さんも書かれている通り)ORDER BY句で明示的に並び順を指定しない限りは、どういう順序で呼び出されるか判りません。したがってROWID順ということは保証されません。
一方INSERT時のROWIDの発番ですが、これも昇順になるとは限りません。
ROWIDは行の論理的なアドレスを示すもので、オブジェクト番号、相対ファイル番号、ブロック番号、行番号の4種の情報で構成されているそうです。したがって一見連番で発番されているように見えますが、挿入・削除(あるいは他のオブジェクトへの操作)を繰り返すうちに順序は前後してきます。(後で追加した行に若い値のROWIDが割り当ることがあります)
明智重蔵
大ベテラン
会議室デビュー日: 2005/09/05
投稿数: 127
投稿日時: 2005-11-28 16:53
Oracleマスターの試験問題にありましたが、
distinctやgroup byを指定した時などに暗黙ソートされることを覚えておくと
データを見る時に役に立つことがありますね(order by句を省略できることがある)

納品するソースなどでは明示的にソートしますが
hs25186
会議室デビュー日: 2005/08/01
投稿数: 5
投稿日時: 2005-11-28 20:05
皆様、ご返答ありがとうございます。
(過去の話題は確認していたつもりだったのですが見逃していました。すみません。)

結局はORDER BYをすべきということですね。
私の担当システムでも当然ORDER BYはしているのですが、例えば「日付ごとの購入項目リスト画面」などでは、日付ではORDER BYしていますが、第2キーは使っていません(つまり、同一日付内でのソートまではしていない)。
仮に第2キーまで指定したとしても、第1キー+第2キー内でのソートを定義するにはさらに第3キーでORDER BY指定するしかなく、結局のところはリスト内に表示する全項目でORDER BYをするしかないということになるのでしょうか…。悩ましいところです。
あんとれ
ぬし
会議室デビュー日: 2004/01/14
投稿数: 556
投稿日時: 2005-11-28 22:57
引用:

明智重蔵さんの書き込み (2005-11-28 16:53) より:

Oracleマスターの試験問題にありましたが、
distinctやgroup byを指定した時などに暗黙ソートされることを覚えておくと
データを見る時に役に立つことがありますね(order by句を省略できることがある)



将来のバージョンに渡って保証されるものではないですし、マニュアルには ORDER BY 句がないと並び順が保証されないことはちゃんと記述されてますので、おっしゃる通り、DISTINCT や GROUP BY を指定しても、並び順を指定したいときは ORDER BY 句を記述するべきでしょうね。
unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2005-11-28 23:20
引用:

hs25186さんの書き込み (2005-11-28 20:05) より:
仮に第2キーまで指定したとしても、第1キー+第2キー内でのソートを定義するにはさらに第3キーでORDER BY指定するしかなく、結局のところはリスト内に表示する全項目でORDER BYをするしかないということになるのでしょうか…。悩ましいところです。


ソート順は、一意に決定するように全項目を ORDER BY するか、あるいは、ソートが不要な項目は順不同(順序が不定)であることを明示するか、のいずれかに決めたほうが良いです。
Oracle とかは良くは知りませんが、ソートだけを理論的に考えた場合、第1キーだけで ORDER BY するのも、第1キー+第2キー+...+第nキー で ORDER BY するのも、コストは変わらないはずです。DBMS の仕組みまで考えるとデーターページやインデックスにアクセスするかどうかのコストは多少違うのかもしれませんが、でもそこまでケチる必要性は高くないと思います。
「ソートが不要な項目は順不同」というのもアリかもしれませんが、バグの再現性が低くなったりとデバッグが複雑になるので、順不同よりは全項目が順になっているほうが、予防的な意味では良いと思います。
いやらしいものとしては、仕様では順不同なのに、使ってると大概の場合はソートされているように見えるから、ついそれをあてにした操作をしてしまい、そう言う時に限ってたまたま順序が乱れていて、トラブルになる、というのがあります。
Desmo
大ベテラン
会議室デビュー日: 2004/03/24
投稿数: 149
投稿日時: 2005-11-29 08:48
引用:

hs25186さんの書き込み (2005-11-28 20:05) より:
仮に第2キーまで指定したとしても、第1キー+第2キー内でのソートを定義するにはさらに第3キーでORDER BY指定するしかなく、結局のところはリスト内に表示する全項目でORDER BYを…



ここの意味がよく判らないのですが・・・ソートしたい項目のみソート指定すれば良いのでは?
例えば購入順にソートしたいのであれば、項目に"購入時刻"を加えて第2キーとするか、もっと厳密に順序を指定するなら連番を保持させてそれを使うことが考えられます。
あるいは"購入NO."のようなものが連番で振られているのならそれを第2キーとする方法もあります。
さらに細かいソートをしたいなら、当然 第3キー、第4キーと増やす必要がありますが、「リスト内に表示する全項目でORDER BYする」必要までは無い思います。

[ メッセージ編集済み 編集者: Desmo 編集日時 2005-11-29 17:02 ]
1

スキルアップ/キャリアアップ(JOB@IT)