ページの先頭行へ戻る
PRIMEFLEX for HA Database 業務開発ガイド(Native SQL編)
FUJITSU Integrated System

5.4.2 ジョイン方法のチューニング

ジョインには、マージジョイン、フェッチジョイン、ネスティドループジョインの3種類のジョイン方法があります。ネスティドループジョインは、異なる表間の列を比較述語“=”で指定していない場合に動作します。マージジョインは大量のデータをジョインする場合に有効な手法です。フェッチジョインは、OLTP業務での少量データ検索に有効なジョイン手法です。

適切なジョイン方法を選択する

ジョインの方法は、PRIMEFLEX for HA Databaseが自動的に選択しますが、最適化パラメタ“JOIN_RULE”で、マージジョインを優先して選択するか、フェッチジョインを優先して選択するかを指定することができます。

ただし、ASSIST指定のジョインASSISTによるチューニングを行わない場合、フェッチジョインを有効にするためには、表の結合列にインデックスを定義する必要があります。インデックスになっていない場合は、“JOIN_RULE”でフェッチジョインを優先するように指定しても、マージジョインが選択されるので注意が必要です。

参照

ASSIST指定のジョインASSISTによるチューニングの詳細については“Symfoware Server アプリケーション開発ガイド(共通編)”を参照してください。

フェッチジョインにおけるジョインする方向

フェッチジョインでは、ジョインする方向により、性能値が左右されます。フェッチジョインの軸となる表は、なるべくレコード件数が絞り込まれている表である方が性能は良くなります。

上記の例で、TBL1側が“TBL1.C2 BETWEEN 10 AND 20”で十分に絞り込まれるのであれば、TBL1→TBL2の順でジョインを行った方が性能が良くなります。PRIMEFLEX for HA Databaseが選択するアクセスモデルの精度を上げるには、IX-2をBETWEEN述語で検索するときに、何パーセントぐらいのデータを検索するのかがなるべく正確である方が良いです 。PRIMEFLEX for HA Databaseがアクセスプランを選択したときの読み込むレコード件数の見積もり結果はアクセスプランに出力されるので、性能情報で取得される実際の検索結果件数と大きく異なる場合は、インデックスの異なるキー値数を変更したり、“SS_RATE”による選択率を変更して、実際に検索する件数に近くなるようにチューニングすると、PRIMEFLEX for HA Databaseのアクセスプランの選択精度が向上します。上記の例で、もしTBL2→TBL1の順でジョインしているなら、BETWEENの選択率を“SS_RATE”で小さくすることにより、TBL1→TBL2でジョインするようになります。

また、フェッチジョインは、ジョインする表のジョインキーにインデックスが定義されていないと選択されないことを利用して、IX-1を削除することにより、TBL1→TBL2へのフェッチジョインしか行うことができなくなります。定型的にジョイン方向が決まるような場合(絞り込める表が必ず決まっているような場合)は、その表に対するジョインキーにあえてインデックスを定義しないのも1つのチューニング手法です。

ASSIST指定によるチューニング

最適化情報や最適化パラメタを変更すると、他のアプリケーションやSQL文に悪影響がでる場合があります。このような場合、ASSIST指定を利用すると、最適化情報や最適化パラメタを変更することなく、ジョイン方法やフェッチジョインする方向を固定化することができます。ジョイン方法を固定化したい場合は“JOIN_RULE”を、フェッチジョインする方向などジョイン順を固定化したい場合は“LEADING_TABLE”を利用します。

上記のSQL文例で、TBL1→TBL2の順にジョインしたい場合は、以下のようにLEADING_TABLEを指定します。

SELECT /* ASSIST LEADING_TABLE(TBL1,TBL2) */ *
  FROM SCM1.TBL1,SCM2.TBL2
 WHERE TBL1.C1=TBL2.C1
  AND  TBL1.C2=10
  AND  TBL2.C2=1

ジョインする方向に加えて、ジョイン方法をフェッチジョインにしたい場合は、以下のようにJOIN_RULE指定します。

SELECT /* ASSIST LEADING_TABLE(TBL1,TBL2) JOIN_RULE(FETCH) */ *
  FROM SCM1.TBL1,SCM2.TBL2
 WHERE TBL1.C1=TBL2.C1
  AND  TBL1.C2=10
  AND  TBL2.C2=1

また、ジョインに利用するインデックスを指定したい場合は、“JOIN_RULE”、“LEADING_TABLE”、“USE_INDEX”を同時に指定します。

SELECT /* ASSIST LEADING_TABLE(TBL1,TBL2) JOIN_RULE(FETCH) USE_INDEX(TBL2(IX_4)) */ *
  FROM SCM1.TBL1,SCM2.TBL2
 WHERE TBL1.C1=TBL2.C1
  AND  TBL1.C2=10
  AND  TBL2.C2=1

参照

“JOIN_RULE”、“LEADING_TABLE”および“USE_INDEX”の詳細については、“Symfoware Server アプリケーション開発ガイド(共通編)”を参照してください。