6.3.1 効率の悪いアクセスパス(MERGE JOIN)のチューニング例の説明
効率の悪い結合方法のMERGE JOINを,NESTED LOOPS JOINに変更するチューニング例を説明します。
- 〈この項の構成〉
(1) 例題の概要
顧客表および注文管理表から,特定の市区町村に住む顧客が注文した情報を顧客名とともに検索します。
(a) 表およびインデクス定義
顧客表および注文管理表の構成と,それぞれの表に定義されたインデクスについて,次に示します。
(b) SQL文
実行するSQL文を次に示します。LIKE述語の後の?パラメタには,市区町村名を前方一致で検索するパターン文字列を指定します。
SELECT 顧客表.顧客名, 注文管理表.注文日, 注文管理表.注文金額 FROM 顧客表,注文管理表 WHERE 顧客表.顧客ID = 注文管理表.顧客ID AND 顧客表.顧客住所 LIKE ?
(c) データ件数とヒット件数
データ件数とSQL文のヒット件数について,次に示します。
内容 |
件数 |
---|---|
顧客表のデータ件数 |
約1,000,000件 |
顧客表から取り出す件数 |
約5件 |
注文管理表のデータ件数 |
約12,000,000件 |
SQL文のヒット件数 |
約25件 |
(d) アクセスパス
このSQL文のアクセスパスを出力すると,アクセスパス情報の結合方法の行に「MERGE JOIN」と表示されます。HiRDB SQL Tuning AdvisorとUAP統計レポートのアクセスパス出力結果を次に示します。
(2) チューニングの考え方
MERGE JOINは効率の悪いアクセスパスのため,対策が必要です。MERGE JOINの対策方法は,「MERGE JOINの対策」で説明しています。この内容に沿って対策してください。
(a) 結合方法の検討
「MERGE JOINの対策」の「対策方法」を参照して,どの結合方法に変更するか検討してください。この例のSQL文はヒット件数が少ないため,NESTED LOOPS JOINに変更します。
(b) 対策方法
NESTED LOOPS JOINにする手順は,「MERGE JOINの対策」の「[NESTED LOOPS JOINにするには]」を参照してください。
この例では,次の対策を実施します。
-
注文管理表の顧客ID列にインデクスを追加する
-
SQL文に結合方法を明示的に指定する
- [外部キーとインデクスについて]
-
注文管理表の顧客ID列には,顧客表の顧客ID列を参照する外部キーが定義されています。外部キーを定義しても,インデクスは定義されません。外部キーを結合条件に使用する場合は,定義系SQLのCREATE INDEXでインデクスを定義してください。
(3) チューニング結果
(a) 表およびインデクス定義
注文管理表の顧客ID列にインデクス「注文管理表IDX1」を追加してください。変更後のインデクス定義について,次に示します。
(b) SQL文
結合方法を明示的に指定するSQL文に変更してください。下線部分が変更した個所です。
SELECT 顧客表.顧客名, 注文管理表.注文日, 注文管理表.注文金額 FROM 顧客表 INNER JOIN BY NEST 注文管理表 ON 顧客表.顧客ID = 注文管理表.顧客ID WHERE 顧客表.顧客住所 LIKE ?
(c) アクセスパス
アクセスパスを出力して,注文管理表が内表であるNESTED LOOPS JOINに変更されたことを確認してください。
(4) まとめ
このチューニング例のポイントを次に示します。
- [ポイント]
-
外部キーを指定した列を結合条件に使用する場合は,インデクスを追加してください。