S_a_k_Uの日記みたいなDB

~サクゥーと呼ばないで~

SELECT文で一時作業表領域を使用するシチュエーション

スケーラブルデータベースサーバ HiRDB Version 8 解説(Windows(R)用)
6.4 作業表用ファイル
HiRDBのマニュアルの記述読んでも???なんで。
1つのテーブルをSELECTした場合、

WHERE句 ORDER BY句 一時作業表領域
なし なし 使わない
あり(INDEX項目) なし 使わない
なし あり(INDEX項目) 使わない
あり(INDEX項目) あり(INDEX項目) 使わない
あり(非INDEX項目) なし 使わない
なし あり(非INDEX項目) 使う
あり(非INDEX項目) あり(非INDEX項目) 使う
あり(INDEX項目) あり(非INDEX項目) 使う
あり(非INDEX項目) あり(INDEX項目) 使う


動作的に、WHERE句はINDEXを使う/使わないかな?で変わるかな?とか思ったけど、
・WHERE句でINDEX項目で、LIKEの後方一致で検索すると「FULL SCAN」となる
・WHERE句で非INDEX項目で、等式で検索すると、「TABLE SCAN」となる
という点に違いがあるくらいで、一時作業表領域の使用する/しないに違いはなかった。
で、「FULL SCAN」と「TABLE SCAN」と全件検索の違いは…どこに書いてるんだろ(謎
それは置いといて、一時作業表領域の使用については、
・非INDEX項目でORDER BYすると必ず使用する
・INDEX項目でORDER BYしても、WHEREで非INDEX項目を使用すると必ず使用する
となると見える。


んで、SELECT文で一時作業表領域を使う場合ということで、

インデクスを定義した複数の列に検索条件を指定する場合

とあるけど、INDEX項目の2つのカラムをAND/ORで指定しても一時作業表領域を使ってないっぽいし???

インデクスを定義していない列に対してORDER BY句を指定する場合

とあるけど、非INDEX項目で抽出すると、インデックスを定義した列でソートしても一時作業表領域を使ってるっぽいし???

GROUP BY句を指定する場合

とあるけど、INDEX項目/非INDEX項目でGROUP BYしても一時作業表領域を使ってないっぽいし???
※としてパラレルサーバかシングルサーバかの違いと集合関数についてだけ書いてるけど、GROUP BYとは違うんかな???



ちなみに、ここの開発環境は体験版だから、シングルサーバだよねwww



サイズについては、SELECTするカラムと行数に依存(と思う)。
WHERE句の条件の数とは関係ない(っぽい)。
ORDEY BY句とGROUP BY句の項目の数は関係あるっぽい。
けど、計算式の中の2024とか4096という数字と関係があるようで、アプリケーションでORDER BYは最大10項目まで可能で、5項目と10項目でそれぞれ使用する一時作業表領域に差がなかったので、アプリケーションとしては関係ない(と思う)。
一応、1文字の240カラムくらいをORDER BYにしても、一時作業表領域が変化しなかったのは確認。
一時作業表領域は2[KB]or4[KB]単位で使うことになってて、カラム数×行数でリニアに変化する(ような気がする)。
カラム数は数100とかってあって、ORDEY BY句とGROUP BY句の項目数と比較すると想定の範囲内になるし。
スケールデータベースサーバ HiRDB Version 8 システム導入・設計ガイド(Windows(R)用)
18.2.1 SQL文が使用する作業表用ファイルの容量