4.5.10 ハッシュジョイン,副問合せのハッシュ実行を適用する場合の準備
SQL拡張最適化オプションで「ハッシュジョイン,副問合せのハッシュ実行」を適用する場合に,設定しておく項目について説明します。
- 〈この項の構成〉
(1) 事前に設定する項目
ハッシュジョイン,副問合せのハッシュ実行を適用する場合,次の項目を設定しておく必要があります。
-
ハッシュ表サイズ
-
作業表用バッファの確保方式
-
作業表用バッファサイズ
(a) ハッシュ表サイズ
システム定義のpd_hash_table_sizeオペランド,又はクライアント環境定義のPDHASHTBLSIZEでハッシュ表サイズを設定します。ハッシュ表サイズは,ハッシュ表最大行長を算出後,次の計算式で求めた値以上を設定してください。
また,ハッシュ表サイズはシステム定義のpd_work_buff_sizeオペランド,又はpd_work_buff_expand_limitオペランドより小さい値を設定してください。同じ値,又は大きい値を指定すると,ハッシュジョイン,副問合せのハッシュ実行時にエラーになります。
ハッシュ表サイズ(単位:キロバイト) ≧↑(ハッシュ表最大行長(単位:バイト)×2+32)÷128↑×128
- ハッシュ表最大行長:
-
個々のSELECT文について,次の単位でハッシュ表行長を算出します。その中で最大のもの(ハッシュ表最大行長)を求めます。
-
複数の表を=で結合している問合せ指定
-
副問合せ(次のどれかに該当する場合)
・=ANYの限定述語の,右側の表副問合せ
・=SOMEの限定述語の,右側の表副問合せ
・IN述語の右側の表副問合せ
・上記以外で,探索条件中に=で外への参照列を指定している副問合せ
ハッシュ表行長の算出方法を次に示します。
-
- 複数の表を=で結合している問合せ指定
-
-
=で結合している表の選択式及び探索条件中に指定した列について,表ごとに次の計算式から行長を求めます。
-
1で求めた表ごとの行長の中で,最小のもの以外を使用し,次の計算式でハッシュ表行長を求めます。
-
- 副問合せ
-
副問合せの選択式中に指定した列,及び探索条件中の外への参照列を含む述語に指定した列について,次の計算式からハッシュ表行長を求めます。
- ai:
-
i番目のデータ長です。データ長については,マニュアル「HiRDB Version 9 システム導入・設計ガイド」を参照してください。ただし,=で結合している表の選択式にだけ指定した,定義長256バイト以上の文字データ(各国文字,混在文字含む)の場合は12となります。
上記から求めたサイズのハッシュ表には,1,500〜2,000行を格納できます。この行数に比べて,ジョインの内表件数や副問合せの検索件数が多い場合は,バケット分割が複数回実行されて,性能が良くならないことがあります。この場合,次の一括ハッシュジョインのハッシュ表サイズを算出して設定するか,又は「ハッシュ表サイズのチューニング方法」を参照してチューニングしてください。
一括ハッシュジョインのハッシュ表サイズ(単位:キロバイト) =↑(ハッシュ表データページ数+ハッシュ表管理テーブルページ数) ÷1セグメントページ数↑×128
ハッシュ表データページ数 =↑ハッシュ表行数÷MIN{↓(ハッシュ表ページ長−48)÷ハッシュ表行長↓,255}↑ +63
ハッシュ表管理テーブルページ数 =↑(16×ハッシュ表行数 +(↑(ハッシュ表データページ数×ハッシュ表ページ長+16×ハッシュ表行数) ÷(1セグメントページ数×ハッシュ表ページ長)↑×8)+8) ÷ハッシュ表ページ長↑
1セグメントページ数 =↓(128×1024)÷ハッシュ表ページ長↓
ハッシュ表ページ長は,次の表のハッシュ表行長から求めてください。
ハッシュ表行長 |
ハッシュ表ページ長 |
---|---|
0〜1012 |
4096 |
1013〜2036 |
8192 |
2037〜4084 |
16384 |
4085〜16360 |
32768 |
16361〜32720 |
↑(ハッシュ表行長+48)÷2048↑×2048 ハッシュ表行長: 一括ハッシュジョインの対象がジョインの場合は,ジョインの内表の件数です。対象が副問合せの場合は,探索条件中の外への参照列を含む述語を除いた副問合せの検索件数です。 |
(b) 作業表用バッファの確保方式
作業表用バッファの確保方式を,サーバプロセス単位でバッファ一括確保(pool)に設定しておく必要があるため,システム定義のpd_work_buff_modeオペランドにpoolを指定します。
(c) 作業表用バッファサイズ
ハッシュ表は,作業表用バッファ内に確保されます。指定したハッシュ表サイズより作業表用バッファサイズ,又は作業表用バッファの増分確保の上限サイズが小さいと,作業表用バッファ不足でエラーとなります。したがって,システム定義のpd_work_buff_sizeオペランド又はpd_work_buff_expand_limitオペランドには,次の計算式で求めた値以上を設定してください。
作業表用バッファサイズ(単位:キロバイト) ≧(ハッシュ表サイズ(単位:キロバイト)×2+256) ×SELECT文のハッシュジョイン最大数+128
- SELECT文のハッシュジョイン最大数:
-
個々のSELECT文のハッシュジョイン数を次の計算式から求めて,その中で最大のものをSELECT文のハッシュジョイン最大数とします。なお,ハッシュジョイン数は,アクセスパス表示ユティリティ(pdvwopt)で出力される結合処理情報のJoin Typeが"HASH JOIN"となっている項目をカウントすることでも求められます。
SELECT文でのハッシュジョイン数 =((=で結合している表数)−(=で結合している問合せ指定数)) +(=ANYの限定述語の数) +(=SOMEの限定述語の数) +(IN(副問合せ)の指定数) +(そのほかの副問合せで,探索条件中に=で 外への参照列を指定している副問合せ数)
なお,複数のカーソルを同時に開いて検索する場合は,カーソルごとに算出した値を合計します。
(例) SELECT A.A1,B.B2,C.C3 FROM A,B,C ......................3-1 WHERE A.A1=B.B1 AND A.A2=B.B2 AND B.B3=C.C3 AND A.A1=C.C1 AND A.A4=ANY(SELECT D.D4 FROM D) ..................1 AND A.A5=SOME(SELECT E.E5 FROM E) .................1 AND A.A6 IN(SELECT F.F6 FROM F WHERE F.F1=A.A1) ...1 AND EXISTS(SELECT G.G1 FROM G WHERE G.G1=B.B1) ...1 この例の場合,(3-1)+1+1+1+1となるので,このSELECT文のハッシュジョイン数は6になります。
なお,上記の作業表用バッファサイズの計算式で求めた値に,更に4,096キロバイト程度の余裕があれば,バケット分割のときの入出力単位が大きくなるため,性能が良くなります。
すべてバケット分割をしない一括ハッシュジョインとなる場合,次の計算式を満たしていれば実行できます。
作業表用バッファサイズ(単位:キロバイト) ≧ハッシュ表サイズ(単位:キロバイト) ×SELECT文のハッシュジョイン最大数+384
(2) ハッシュ表サイズのチューニング方法
(a) 利用するチューニング情報
ハッシュ表サイズは,次のどちらかのチューニング情報を基にチューニングできます。
-
UAP統計レポート(クライアント環境定義PDUAPREPLVLを指定)
-
統計解析ユティリティのUAPに関する統計情報
UAP統計レポートについては「UAP統計レポート機能」を,統計解析ユティリティについてはマニュアル「HiRDB Version 9 コマンドリファレンス」を参照してください。
(b) チューニング情報から分かる項目
ハッシュ表サイズのチューニング情報を取得すると,次のことが分かります。
-
すべてのデータを一括してハッシュ表に展開する一括ハッシュジョインになっているか,又はバケット単位にハッシュ表に展開するバケット分割ハッシュジョインになっているか
-
バケット分割ハッシュジョインの場合に,バケットの再分割をしているか
-
バケット分割ハッシュジョインの場合に,一括ハッシュジョインにするにはハッシュ表サイズをどのくらいにしたらよいか
-
バケット分割ハッシュジョインの場合に,バケットの再分割をしないようにするためにはハッシュ表サイズをどのくらいにしたらよいか
なお,バケットの再分割とは,バケットの大きさがハッシュ表サイズを超える場合に,最大3レベルまでバケット分割を再帰的に繰り返すことをいいます。例を次に示します。
1回のバケット分割での分割数は,次の計算式から決まります。
バケット分割数 =MIN{↓(ハッシュ表サイズ÷2)÷ハッシュ表ページ長↓,64}
また,一括ハッシュジョインの場合でも,ジョインの内表については1レベルバケット分割をします。
(c) チューニング方法
ハッシュ表サイズのチューニング方法を次の表に示します。
チューニング情報 (単位:キロバイト) |
チューニング方法 |
---|---|
最大一括ハッシュ表サイズ |
ハッシュ表サイズにこの値以上が設定されていれば,すべてバケット分割をしない一括ハッシュジョインになります。※1また,この値が,ハッシュ表サイズに指定できる上限を超えている場合は,一括ハッシュジョインにはできません。 この値が0の場合は,ハッシュジョイン,副問合せのハッシュ実行がされていません。 |
1レベル最大バケットサイズ |
ハッシュ表サイズにこの値以上が設定されていれば,バケット分割が1レベルで完了しています。また,バケット分割が2レベル以上の場合は,ハッシュ表サイズにこの値を指定することで,バケット分割が1レベルで完了するようになります。※2 すべてバケット分割をしない一括ハッシュジョインの場合は,この値には0が表示されます。 |
2レベル最大バケットサイズ |
ハッシュ表サイズにこの値以上が設定されていれば,バケット分割が2レベルで完了しています。また,バケット分割が3レベル以上の場合は,ハッシュ表サイズにこの値を指定することで,バケット分割が2レベルで完了するようになります。※2 2レベルバケット分割が一度もされなかった場合は,この値には0が表示されます。 |
3レベル最大バケットサイズ |
ハッシュ表サイズにこの値以上が設定されていれば,バケット分割が3レベルで完了しています。 ハッシュ表サイズがこの値より小さい場合,1バケットを部分的にハッシュ表展開していく処理となり,処理効率が悪くなります。この場合,ハッシュ表サイズにこの値以上を設定するようにしてください。※2 また,ハッシュジョイン,副問合せのハッシュ実行を適用しないようにした方が,性能が良くなる場合もあります。 2レベルバケット分割が一度もされなかった場合は,この値には0が表示されます。 |
- 注※1
-
ハッシュ表サイズを大きくすると,バケット分割数を求める計算式に従って,1回のバケット分割数が増加することがあります。このため,チューニング情報取得時よりも,大きなハッシュ表サイズが必要となることがあります。
チューニング情報を利用してハッシュ表サイズを大きくした場合,再度チューニング情報を取得し,意図したとおりになっていなければ,新たに取得したチューニング情報に合わせて,再びハッシュ表サイズを大きくする必要があります。
- 注※2
-
ハッシュ表サイズを大きくすると,バケット分割数を求める計算式に従って,1回のバケット分割数が増加することがあります。このため,チューニング情報取得時よりも,小さなハッシュ表サイズでも,意図したレベルでバケット分割が完了することがあります。
これに対して,ハッシュ表サイズを小さくすると,1回のバケット分割数を減少させることがあるため,チューニング情報取得時と同じレベルでバケット分割が完了しなくなることがあります。したがって,このチューニング情報は,ハッシュ表サイズを大きくしていくときに利用してください。