6.25.3 ハッシュテーブルを使用した検索時に作成される作業表の数
ここでは,ハッシュテーブルを使用した検索時に作成される作業表の数の見積もり方について説明します。
次に示すどれかに該当する場合,ハッシュテーブルを使用した検索が行われます。
-
表の結合方式でハッシュジョインが適用された場合
-
副問合せの処理方式でハッシュ実行が適用された場合
-
グループ化の処理方式,DISTINCT集合関数の処理方式でグローバルハッシュグループ化が適用された場合
-
SELECT DISTINCTの処理方式でハッシュ実行が適用された場合
-
集合演算の処理方式でハッシュ実行が適用された場合
サーバ定義およびクライアント定義のadb_sql_exe_hashtbl_area_sizeオペランドの値に従って,ハッシュテーブル領域が確保されて,ハッシュジョイン処理が行われます。このとき,確保されたハッシュテーブル領域が不足した場合,作業表が作成されます。
ハッシュテーブルを使用した検索時に作成される作業表の数は,実行するSQL文ごとに次の計算式で求めてください。
計算式
変数の説明
変数の説明中に出てくる列長およびデータ長については,「表6‒9 各データ型のデータ長の一覧」を参照して求めてください。
- A:ハッシュテーブル最大行長(単位:バイト)
-
各問合せ式本体で,次の単位ごとにハッシュテーブル行長を求めてください。その中で最大の値が,ハッシュテーブル最大行長になります。
-
複数の表を=で結合している問合せ指定
=で結合している各表に対して,選択式および探索条件中に指定したすべての列について,列長の合計を求めてください。
なお,=の結合条件の左右に列指定を含む値式を指定している場合は,その値式の結果のデータ長も合計に加えてください。
表ごとに求めた値のうち,最小値を除いたすべての値の合計がハッシュテーブル行長になります。
ただし,2表だけを=で結合していて,その結合の左右に指定した値式の結果のデータ型またはデータ長が異なる場合は,すべての値の合計を求めてください。その際,最小値は除かないでください。
また,アクセスパスの表示結果から,ハッシュテーブル行長を求めることができます。表の結合方式がHASH JOINとなっているツリーの問合せに対して,上記のことを実施し,ハッシュテーブル行長を求めてください。
-
限定述語の表副問合せ
次に示す4つの値を合計したものが,ハッシュテーブル行長になります。
-
副問合せの選択式の結果のデータ長の合計値
-
副問合せに指定した集合関数の結果のデータ長の合計値
-
探索条件中の外への参照列を含む述語に指定したすべての列の列長の合計値
-
限定述語またはIN述語の右側の表副問合せの選択式の結果と,その述語の左側に指定している列のデータ型またはデータ長が異なる場合に,その述語の左側に指定している列の列長
なお,アクセスパスの表示結果から,ハッシュテーブル行長を求めることができます。副問合せの処理方式がSUBQUERY HASHとなっているツリーの問合せに対して,上記の4つの値を合計したものが,ハッシュテーブル行長になります。
-
-
IN述語中の表副問合せ
ハッシュテーブル行長の求め方は,限定述語の表副問合せを参照してください。
-
限定述語の表副問合せおよびIN述語中の表副問合せ以外で,探索条件中に=で外への参照列を指定している副問合せ
ハッシュテーブル行長の求め方は,限定述語の表副問合せを参照してください。
-
GROUP BY句を含む問合せ指定
グループ化列の列長,および集合関数の結果のデータ長をそれぞれ求めてください。求めた値を合計したものが,ハッシュテーブル行長になります。
なお,アクセスパスの表示結果から,ハッシュテーブル行長を求めることができます。グループ化の処理方式がGLOBAL HASH GROUPINGとなっているツリーの問合せに対して,グループ化列の列長,および集合関数の結果のデータ長をそれぞれ求めてください。求めた値を合計したものが,ハッシュテーブル行長になります。
-
DISTINCT集合関数を含む問合せ指定
グループ化列の列長,DISTINCT集合関数の引数に指定した値式の結果のデータ長,および集合関数(DISTINCT集合関数を除く)の結果のデータ長をそれぞれ求めてください。求めた値を合計したものが,ハッシュテーブル行長になります。
-
SELECT DISTINCTが指定された問合せ指定
SELECT DISTINCTの選択式のデータ長の合計が,ハッシュテーブル行長になります。
なお,アクセスパスの表示結果から,ハッシュテーブル行長を求めることができます。SELECT DISTINCTの処理方式がハッシュ実行となっているツリーの問合せに対して,SELECT DISTINCTの選択式のデータ長をそれぞれ求めてください。求めた値を合計したものが,ハッシュテーブル行長になります。
-
UNION,またはUNION DISTINCTが指定された問合せ式本体
問合せ式本体の結果導出される表の列の列長を求めてください。求めた値を合計したものが,ハッシュテーブル行長になります。
なお,アクセスパスの表示結果から,ハッシュテーブル行長を求めることができます。集合演算の処理方式がハッシュ実行となっているツリーの問合せに対して,問合せ式本体の結果導出される表の列の列長をそれぞれ求めてください。求めた値を合計したものが,ハッシュテーブル行長になります。
-
- B:中間検索結果最大件数
-
次の計算式から求めてください。
各問合せ式本体で,次の単位ごとに一時中間検索結果の最大件数を求めてください。その中での最大件数が,一時中間検索結果の最大件数になります。
-
複数の表を=で結合している問合せ指定
=の結合それぞれに対して,結合の左右それぞれの検索結果件数のうち,小さい方の値を求めます。求めた結合ごとの値のうち,最大の値が中間検索結果件数になります。
なお,アクセスパスの表示結果から,中間検索結果件数を求めることができます。表の結合方式がHASH JOINとなっているツリーの問合せに対して,外表の結果件数を求めてください。求めた件数のうち,最大の件数が中間検索結果件数になります。
-
限定述語の表副問合せ
副問合せの結果の行数が中間検索結果件数になります。
なお,アクセスパスの表示結果から,中間検索結果件数を求めることができます。副問合せの処理方式がSUBQUERY HASHとなっているツリーの問合せに対して,副問合せの結果件数を求めてください。求めた件数のうち,最大の件数が中間検索結果件数になります。
-
IN述語中の表副問合せ
中間検索結果件数の求め方は,限定述語の表副問合せを参照してください。
-
限定述語の表副問合せおよびIN述語中の表副問合せ以外で,探索条件中に=で外への参照列を指定している副問合せ
中間検索結果件数の求め方は,限定述語の表副問合せを参照してください。
-
GROUP BY句を含む問合せ指定
グループ化を適用したあとの結果件数が,中間検索結果件数になります。
なお,アクセスパスの表示結果から,中間検索結果件数を求めることができます。グループ化の処理方式がGLOBAL HASH GROUPINGとなっているツリーの問合せに対して,グループ化を適用したあとの結果件数を求めてください。求めた件数のうち,最大の件数が中間検索結果件数になります。
-
DISTINCT集合関数を含む問合せ指定
重複排除後の結果件数が中間検索結果件数になります。問合せ指定にGROUP BY句を指定する場合は,DISTINCT集合関数の引数もグループ化列と見なし,そのグループ化を適用したあとの結果件数を目安にしてください。
-
SELECT DISTINCTが指定された問合せ指定
重複排除後の結果件数が中間検索結果件数になります。
-
UNION,またはUNION DISTINCTが指定された問合せ式本体
集合演算後の結果件数が中間検索結果件数になります。
-
- C:ハッシュテーブル数
-
次の計算式から求めてください。
- 注※
-
SQLパラレル実行機能が適用される検索系SQLの場合は,GROUP BY句の指定数×2としてください。
ハッシュテーブル数は,アクセスパスの表示結果からも求めることができます。アクセスパスを表示できる場合は,アクセスパスの表示結果と次の計算式からハッシュテーブル数を求めてください。
- 注※
-
アクセスパスの表示結果の<<Tree View>>に表示される情報から求めてください。例えば,<<Tree View>>中にHASH JOINが2回表示されている場合,「HASH JOIN(表の結合方式)の表示数」は2と計算してください。
- D:ハッシュテーブル領域
-
次の計算式から求めてください。
クライアント定義のadb_sql_exe_hashtbl_area_sizeオペランドの指定値が,サーバ定義のadb_sql_exe_hashtbl_area_sizeオペランドの指定値よりも小さい場合は,クライアント定義の指定値を代入してください。それ以外は,サーバ定義の指定値を代入してください。
なお,adb_sql_exe_hashtbl_area_sizeオペランドの指定値が0の場合,ハッシュテーブルを使用した検索は適用されません。