6. 次の条件に当てはまる場合は,「クライアント環境変数の指定(任意)」画面で,該当するクライアント 環境定義を指定してください。
3.4 ここは必ず対策しよう
3.4.6 WORK TABLE SUBQ の対策 (1) WORK TABLE SUBQ とは
図 3‒28 対策方法の例(UAP 統計レポートの場合)
3.4.6 WORK TABLE SUBQ の対策
図 3‒29 WORK TABLE SUBQ の処理方式
(2) 確認方法
WORK TABLE SUBQ の確認方法を次に示します。
• HiRDB SQL Tuning Advisor の場合
アクセスパス情報の「副問合せ実行方式」に「WORK TABLE SUBQ」と表示されます。WORK TABLE SUBQ の出力例を次に示します。
図 3‒30 HiRDB SQL Tuning Advisor の出力例
• UAP 統計レポートの場合
アクセスパス情報の「Sub Query Type」に「WORK TABLE SUBQ」と表示されます。WORK TABLE SUBQ の出力例を次に示します。
図 3‒31 UAP 統計レポートの出力例
(3) 対策方法
適用条件を確認して,次のどちらかの方法で対策してください。
表 3‒8 WORK TABLE SUBQ の対策方法
項番 対策方法 適用条件
1 インデクスを追加または変更して,副問合せの実行方式 を WORK TABLE ATS SUBQ に変更してください。
• IN 述語または=ANY または=SOME の限定述語に 対する副問合せである
• 次の関係を満たす場合
外側の問合せのヒット件数>副問合せのヒット件数
• インデクスの追加または構成列の変更ができる 2 EXISTS 述語を使った SQL 文への変更と,インデクス
を追加または変更して,副問合せの実行方式を NESTED LOOPS ROW VALUE SUBQ に変更してください。
• 次の関係を満たす場合
外側の問合せのヒット件数<副問合せのヒット件数
• SQL 文が変更できる
• インデクスの追加または構成列の変更ができる
(a) WORK TABLE ATS SUBQ への変更
インデクスを追加または変更して,副問合せの実行方式を WORK TABLE ATS SUBQ に変更します。
これによって,外側の問合せのインデクスを使用して副問合せの結果との条件を評価するため,効率がよ いです。また,副問合せのヒット件数分の値を探索条件に指定し,外側の問合せの表を検索するため,副 問合せのヒット件数が少ない場合に効果があります。
次の個所に表示された列を外側の問合せで使用しているインデクスの構成列に加えることで,WORK TABLE ATS SUBQ に変更できます。外側の問合せが TABLE SCAN の場合は,次の個所に表示された 列にインデクスを追加してください。
• HiRDB SQL Tuning Advisor の場合
アクセスパス情報の外側の問合せの「IF-THEN 条件」で,副問合せ(SUBQ)の結果と条件評価して いる列をインデクスの構成列に追加してください。
図 3‒32 HiRDB SQL Tuning Advisor の出力例
• UAP 統計レポートの場合
アクセスパス情報の外側の問合せの「IfThenCnd」で,副問合せ(SUBQ)の結果と条件評価してい る列をインデクスの構成列に追加してください。
図 3‒33 UAP 統計レポートの出力例
[注意事項]
インデクスに構成列を追加する場合は,探索条件の指定方法を考慮して,構成列の順序を決定してくだ さい。詳細は,マニュアル「HiRDB システム導入・設計ガイド」の「インデクス構成列の検討」を参 照してください。
(b) NESTED LOOPS ROW VALUE SUBQ への変更
EXISTS 述語使った SQL 文に変更して,副問合せの実行方式を NESTED LOOPS ROW VALUE SUBQ に変更します。これによって,副問合せのインデクスを使用して,外側の問合せの結果との条件を評価す るため,効率がよいです。また,この方法では,外側の問合せのヒット件数分,副問合せを実行するため,
外側の問合せのヒット件数が少ない場合に効果があります。SQL 文の変更方法の例を次に示します。
表 3‒9 NESTED LOOPS ROW VALUE SUBQ への変更例
述語 変更前 変更後
IN 述語(IN) SELECT * FROM T1 WHERE T1.C1 IN (SELECT T2.C1 FROM T2 WHERE T2.C2 = ?)
AND T1.C3>?
SELECT * FROM T1 WHERE EXISTS(SELECT * FROM T2
WHERE T2.C2 = ? AND T1.C1 = T2.C1) AND T1.C3>?
IN 述語(NOT IN)
SELECT * FROM T1 WHERE
T1.C1 NOT IN (SELECT T2.C1 FROM T2 WHERE T2.C2 = ?)
AND T1.C3>?
SELECT * FROM T1 WHERE NOT EXISTS(SELECT * FROM T2 WHERE T2.C2 = ? AND T1.C1 = T2.C1) AND T1.C3>?
述語 変更前 変更後 限定述語
(=ANY または
=SOME)
SELECT * FROM T1 WHERE
T1.C1 = ANY(SELECT T2.C1 FROM T2 WHERE T2.C2 = ?)
AND T1.C3>?
SELECT * FROM T1 WHERE EXISTS(SELECT * FROM T2
WHERE T2.C2 = ? AND T1.C1 = T2.C1) AND T1.C3>?
また,副問合せのすべての探索条件が 1 つのインデクスで評価できるようにしてください。1 つのインデ クスで評価できているか確認する方法は,「効率の悪い NESTED LOOPS JOIN」の手順を参照してくだ さい。
IN 述語の例題の SQL 文について,対策後のアクセスパスの出力例を次に示します。この例では,副問合 せ側の表 T2 の列 C2 と C1 に複数列インデクスを定義します。