Hitachi

ノンストップデータベース HiRDB Version 9 パフォーマンスガイド


6.3.1 効率の悪いアクセスパス(MERGE JOIN)のチューニング例の説明

効率の悪い結合方法のMERGE JOINを,NESTED LOOPS JOINに変更するチューニング例を説明します。

〈この項の構成〉

(1) 例題の概要

顧客表および注文管理表から,特定の市区町村に住む顧客が注文した情報を顧客名とともに検索します。

(a) 表およびインデクス定義

顧客表および注文管理表の構成と,それぞれの表に定義されたインデクスについて,次に示します。

図6‒7 表およびインデクス定義

[図データ]

(b) SQL文

実行するSQL文を次に示します。LIKE述語の後の?パラメタには,市区町村名を前方一致で検索するパターン文字列を指定します。

SELECT 顧客表.顧客名, 注文管理表.注文日, 注文管理表.注文金額
 FROM 顧客表,注文管理表
 WHERE 顧客表.顧客ID = 注文管理表.顧客ID
 AND 顧客表.顧客住所 LIKE ?

(c) データ件数とヒット件数

データ件数とSQL文のヒット件数について,次に示します。

表6‒4 データ件数とヒット件数

内容

件数

顧客表のデータ件数

約1,000,000件

顧客表から取り出す件数

約5件

注文管理表のデータ件数

約12,000,000件

SQL文のヒット件数

約25件

(d) アクセスパス

このSQL文のアクセスパスを出力すると,アクセスパス情報の結合方法の行に「MERGE JOIN」と表示されます。HiRDB SQL Tuning AdvisorとUAP統計レポートのアクセスパス出力結果を次に示します。

図6‒8 HiRDB SQL Tuning Advisorの出力結果(チューニング前)

[図データ]

図6‒9 UAP統計レポートの出力結果(チューニング前)

[図データ]

(2) チューニングの考え方

MERGE JOINは効率の悪いアクセスパスのため,対策が必要です。MERGE JOINの対策方法は,「MERGE JOINの対策」で説明しています。この内容に沿って対策してください。

(a) 結合方法の検討

「MERGE JOINの対策」の「対策方法」を参照して,どの結合方法に変更するか検討してください。この例のSQL文はヒット件数が少ないため,NESTED LOOPS JOINに変更します。

(b) 対策方法

NESTED LOOPS JOINにする手順は,「MERGE JOINの対策」の「NESTED LOOPS JOINにするには」を参照してください。

この例では,次の対策を実施します。

  1. 注文管理表の顧客ID列にインデクスを追加する

  2. SQL文に結合方法を明示的に指定する

[図データ][外部キーとインデクスについて]

注文管理表の顧客ID列には,顧客表の顧客ID列を参照する外部キーが定義されています。外部キーを定義しても,インデクスは定義されません。外部キーを結合条件に使用する場合は,定義系SQLのCREATE INDEXでインデクスを定義してください。

(3) チューニング結果

(a) 表およびインデクス定義

注文管理表の顧客ID列にインデクス「注文管理表IDX1」を追加してください。変更後のインデクス定義について,次に示します。

図6‒10 表およびインデクス定義

[図データ]

(b) SQL文

結合方法を明示的に指定するSQL文に変更してください。下線部分が変更した個所です。

SELECT 顧客表.顧客名, 注文管理表.注文日, 注文管理表.注文金額
 FROM 顧客表 INNER JOIN BY NEST 注文管理表
 ON 顧客表.顧客ID = 注文管理表.顧客ID
 WHERE 顧客表.顧客住所 LIKE ?

(c) アクセスパス

アクセスパスを出力して,注文管理表が内表であるNESTED LOOPS JOINに変更されたことを確認してください。

図6‒11 HiRDB SQL Tuning Advisorの出力結果(チューニング後)

[図データ]

図6‒12 UAP統計レポートの出力結果(チューニング後)

[図データ]

(4) まとめ

このチューニング例のポイントを次に示します。

[図データ][ポイント]

外部キーを指定した列を結合条件に使用する場合は,インデクスを追加してください。