3.4.5 効率の悪いNESTED LOOPS JOINの対策
- 〈この項の構成〉
(1) 効率の悪いNESTED LOOPS JOINとは
NESTED LOOPS JOINとは,一方の表から1行ずつ行を取り出し,もう一方の表のそれぞれの行に突き合わせて,結合条件を満たす行を取り出す入れ子型のループ処理の結合方法です。先に取り出す表を「外表」,突合せる表を「内表」といいます。
内表のインデクスを利用して結合条件を評価することで,処理効率が良くなります。しかし,結合条件のすべての列がインデクスに含まれていない場合,結合条件の評価がインデクスだけでは判定できず,表データとの突合せが発生するため,処理効率が悪いです。
(2) 確認方法
効率の悪いNESTED LOOPS JOINの確認方法を次に示します。
-
HiRDB SQL Tuning Advisorの場合
次のすべての条件を満たすアクセスパスが該当します。
-
「結合方法」に「NESTED LOOPS JOIN」と表示されている
-
「内表名」に表示された表の「検索方法」に「INDEX SCAN」と表示されている
-
「検索方法」の上に「ロー条件」または「IF THEN条件」の表示があり,その行に外表の列名が表示されている
HiRDB SQL Tuning Advisorの出力例を次に示します。
図3‒25 HiRDB SQL Tuning Advisorの出力例 -
-
UAP統計レポートの場合
次のすべての条件を満たすアクセスパスが該当します。
-
「Join Type」に「NESTED LOOPS JOIN」と表示されている
-
「R Table」に表示された表の「Scan Type」に「INDEX SCAN」と表示されている
-
「Scan Type」の上に「RowCnd」または「IfThenCnd」の表示があり,その行に外表の列名が表示されている
UAP統計レポートの出力例を次に示します。
図3‒26 UAP統計レポートの場合の出力例 -
(3) 対策方法
内表に定義するインデクスは,結合条件となる列をすべて構成列に含めてください。「ロー条件(RowCnd)」または「IF THEN条件(IfThenCnd)」の行に表示されている内表の列をインデクス構成列に加えることで対策できます。この時,最も絞り込める探索条件を指定している列を,第1構成列にしてください。対策方法の例を次に示します。