表バッファ領域に展開しハッシュジョインする)か、バケット分割ハッシュジョイン処理(内表、外表を バケットに分割し、内表の一部を作業表用バッファ領域に展開し、残りを作業表用ファイルに退避す る)かが決まり、性能も大きく異なります。
一括ハッシュジョインにするためには、ハッシュ表サイズを、内表の条件評価後のヒットデータをす べて載せるために十分な大きさにします。
ハッシュ表に内表データをすべて載せるには、以下のシステム定義、クライアント環境変数のオペ
ランドを変更します。① システム定義の
pd_hash_table_size
またはクライアント環境変数のPDHASHTBLSIZE
を大き くする。② システム定義のpd_work_buff_sizeまたはpd_work_buff_expand_limitを大きくする。
(注)一括ハッシュジョインかバケット分割ハッシュジョインかどうか、および一括ハッシュジョインする ために必要なハッシュ表サイズは、
UAP
に関する統計情報またはUAP
統計レポート機能で確 認できます。内表の条件評価後のヒットデータが、ハッシュ表に載りやすくするために、条件評価後のヒットデー タの少ない表を内表とします。
外表と内表を入れ替えは、結合表構文
(INNER JOIN)
を指定することにより行います。ハッシュジョインを一括ハッシュジョインにする場合
付録C-2 グループ分け高速化処理
SQL
最適化オプションの指定を省略した場合、"RAPID_GROUPING"
(グループ分け 高速化処理)は省略値であるため、GROUP BYを指定したSQLに対して、ハッシュ表を 使用したグループ分け高速化処理が適用されます。ハッシュ表のサイズは、クライアント環境定義
PDAGGR
(省略値は1024
)に基づいて決 定されます。ハッシュ表の領域不足を起こさないためには、クライアント環境定義PDAGGR
にグループ化での最大グループ数を指定します。ただし、メモリの使用量とのトレードオフであるため、実メモリの空きサイズより適切な値を検討してください。
グループ分け高速化処理は、グループ化前の行数に対して、グループ数が十分小さい 場合に大きな効果を発揮します。
Point
グループ分け高速化処理に対しては、PDAGGRをチューニングする© Hitachi, Ltd. 2013 , 2015. All rights reserved.
付録C-3 無排他条件判定の指定(1)
107
インデクスが適切に定義されていないため、効率よくインデクスを利用した検索できな い場合や、テーブルスキャンになる場合、検索する行に排他が一時的にかかるため、条 件に該当しないものにも排他がかかってしまいます。このようなとき、無排他条件判定で 探索条件を判定して満たした行にだけ排他を掛けます。
無排他条件判定は、検索処理時には排他を掛けないで、探索条件を判定して満たした
行にだけ排他を掛けます。探索条件を満たさない行、またはキー値に対して排他を掛け ないため、通常の検索と比べて、検索時間が短縮でき、同時実行性を向上させます。Point
厳密な条件判定が要求されない場合は、無排他条件判定の適用を検討する図 C.3-1 通常の検索処理と排他の例 次に検索する行の有無の判定
検索する行に排他を掛ける
探索条件の判定
条件に該当し ない
条 件 に 該 当 する
そ の ま ま の 状態
排 他 を 解 除 する
付録C-3 -1 無排他条件判定の指定(2)
無排他条件判定を指定する場合は、余分な範囲を検索しないように、検索するキーは探索範囲絞
り込めるようにインデクスのチューニングを行っておきます。インデクスのキーによって、探索範囲をある程度絞り込んだ状態から、条件を切り出して検索した
場合、条件を満たすものだけに排他を掛けます。このため、探索範囲の件数に比べて、条件を満た す件数が少ないと、通常の検索処理に比べて(条件を満たす件数/探索範囲の件数)の割合で排 他処理を削減できます。無排他条件判定は、クライアント環境定義の
PDLOCKSKIP
でYES
を指定します。排他を掛けないで条件判定をするため、
COMMIT
していないデータを検索して条件判定するおそ れがあります。例えば、更新トランザクションと同時に条件判定するとき、条件判定での検索結果と、更新トランザクションの処理結果との間に差異(ROLLBACKによる読み飛ばし)が発生することがあ るので注意が必要です。
図 C.3-2 無排他条件判定を使用した検索処理の排他の例 次に検索する行の有無の判定
探索条件の判定
条件に該当し ない
条 件 に 該 当 する
検索する行に 排他を掛ける
そ の ま ま の 状態
そのままの状態
© Hitachi, Ltd. 2013 , 2015. All rights reserved.
付録D. チューニングに関する記述
109
付録D-1 インデクスを有効に使用するための考慮
以下にインデクスを有効に使用するために考慮する点について示します。
A)
大量データのランダム参照とI/Oの増加大量データをアクセスすると、ランダムにデータを参照したり、アクセスする表の全 データページ数を大きく超える
I/O
が発生したりする場合がある。I/O
を削減するため に、絞り込める列にインデクスを定義する。またインデクスを定義した列に絞り込みで きるようにすること。B)
更新列のインデクスメンテナンスによる更新オーバヘッドの増加 インデクス定義時、更新の多い列に対する考慮すること。C)
重複の多いキー値は、インデクスメンテナンスオーバヘッド大ナル値の重複が多い場合は、インデクス定義でナル値の除外を指定すること。
D)
絞り込める条件を指定している検索においてテーブルスキャン絞り込める条件の列にインデクスを定義することによって、表のデータのアクセス量 を削減し、検索性能を改善できる。(表の行数が少なく、現時点で性能が悪くなくても、
将来、行数が増加する場合や、本番環境で行数が多いという場合に、インデクスを利 用すると性能が安定する。)
Point
インデクス定義時は、メリット/デメリットを考慮する© Hitachi, Ltd. 2013 , 2015. All rights reserved.
付録D-2 集合関数 MAX/MIN でのインデクス利用(1)
111
集合関数
MAX
、MIN
は、引数の列にインデクスの構成列を指定します。探索条件がな い場合は、MAX、 MINの引数に、第1構成列を指定します。また、探索条件がある場合 は、条件を満たすインデクス構成列を指定することで、インデクスを利用して最小値・最 大値を求める性能が向上します。Point
集合関数MAX、 MINの引数にする列は、インデクスを定義する探索条件がある場合、次の条件を満たすインデクスが利用される。
=条件列(またはIS NULL条件列)を、第1~第n構成列として連続して含む n≧1
MAX、 MINの引数の列に、第n+1構成列に含む
その他の条件列を第n+2構成列以降に含むSQL文中にC1~Cmまで使用する。
m:定義したインデクスの最大構成列数
SELECT MAX(Cn+1 ), MIN(Cn+1 ) FROM T1
WHERE C1=10 AND …AND Cn=20 AND Cn+2 <30 AND Cm >40
INDEX ON T1(C1, ・・・ , Cn, Cn+1, Cn+2, ・・・, Cm)
図 D.2-1 集合関数MIN/MAXでのインデクスの利用
付録D-2 -1 集合関数 MAX/MIN でのインデクス利用(2)
○
SELECT MAX(ZA.ZSURYO) FROM ZAIKO ZAWHERE ZA.DNO=10 AND ZA.ZNO=20 ;
○
SELECT MAX(ZA.ZSURYO) FROM ZAIKO ZAWHERE ZA.DNO=10 AND ZA.ZNO=20 AND ZA.ZSURYO<30 ;
○
SELECT MAX(ZA.ZSURYO) FROM ZAIKO ZAWHERE ZA.DNO=10 AND ZA.ZNO=20 AND ZA.TANKA<40 ;
×
SELECT MAX(ZA.ZSURYO) FROM ZAIKO ZAWHERE ZA.DNO=10 AND ZA.ZNO<20 ;
×
SELECT MAX(ZA.ZSURYO) FROM ZAIKO ZAWHERE ZA.DNO=10 AND ZA.ZNO=20 AND ZA.SNAME_ID<50 ;
図 D.2-2 最小値・最大値を取得の例 インデクス
X01( DNO, ZNO, ZSURYO, TANKA )
条件にインデクスの第1構成 列から連続して=指定。MAX の引数にインデクスの第
3
構 成列を指定。条件にインデクスの第1構成 列に=指定、第2構成列は<
指定。MAXの引数にインデ クスの第
3
構成列を指定。第2
構成列の条件指定は=
条件 を指定する。条件にインデクス以外の列を 指定。条件にはインデクスの 構成列を指定して、ソート処 理を削減する。
© Hitachi, Ltd. 2013 , 2015. All rights reserved.
付録D-2 -2 集合関数 MAX/MIN でのインデクス利用(3)
113
次の場合は、
MAX
、MIN
利用時、効率的に最小値・最大値を取得できないので注意して ください。
結合検索を指定 GROUP BY
句を指定
引数の異なるMAX
、MIN
を指定
探索条件に値式または256
バイト以上の値 表がサーバ内で複数RDエリアに分割格納され、インデクスも分割インデクス(分割キー
のすべての構成列に=
条件がある場合を除く)以降は、
HiRDB/
パラレルサーバのみ INSERT
~SELECT
文中
集合演算を指定 HAVING
句を指定 FOR READ ONLYを指定
付録D-3 DISTINCT 集合関数のインデクス利用
DISTINCT
集合関数の引数にインデクスの第1
構成列を指定すると、作業表の作成が 回避されます。Point DISTINCT
集合関数の引数にする列はインデクスの第1
構成列に定義する○
CREATE INDEX XO1 ON ZAIKO (SNAME, COL);○
CREATE INDEX XO1 ON ZAIKO (SNAME);×
CREATE INDEX XO1 ON ZAIKO (COL, SNAME);図 D.3-1 インデクス列のみ選択の例
引数が第1構成列にならない SELECT COUNT(DISTINCT ZA.SNAME)
FROM ZAIKO ZA;
© Hitachi, Ltd. 2013 , 2015. All rights reserved.
付録D-4 ネストループジョイン(1)
115
内表検索時に行データを参照して結合条件を評価する指定は、検索の性能を著しく悪く させます。検索の性能向上を図るために、以下に示す結合キーをインデクスに定義して、
インデクス利用効率を向上させます。
結合キーと一致するインデクスである
結合キーのすべての列が第1~第n
構成列に連続して含まれるインデクスである
不連続な場合、第1~第n
構成列は、結合列か=
条件列かIS NULL
条件列であるPoint
インデクスは内表の結合キーを第1構成列から連続して構成列に指定して定義する