33
副問合せは、SQLの構文ベースでアクセスパス(処理手順)がほぼ決まる ため、副問合せを使用する場合は書き方によって大きく性能が異なります。
よって、適切に使用するように心掛けてください。
3-1 副問合せの使用方針
#
方針 メリット1
ジョインで記述可能なSQLは副 問合せを使用せず、ジョインで 記述する。
検索順序、データの突合せ方法をHiRDB が最適化できるので、
SQL
構文をあまり考 えなくて良い。2 FROM
句の副問合せは使用しな い。検索順序、データの突合せ方法、絞り込み のインデクスを
HiRDB
が最適化できるので、SQL
構文をあまり考えなくて良い。3
IN副問合せ(=ANY副問合せ)
と
EXISTS
副問合せは、絞り込み によって使い分ける。絞り込みを伝播できるようになりデータの処 理量が削減できる。
4
IN副問合せ(=ANY副問合せ)
と=副問合せは、副問合せの ヒット件数が1件かどうかで使い 分ける。
インデクスを効率よく使用できるようになり、
データの処理量が削減できる。
5 NOT IN
副問合せ(<>ALL
副問 合せ)はなるべく使用しない。NOT
を含むとデータ処理量が多くなるが、NOT IN
は特に重いので避ける。副問合せを使用する場合は、以下の順に考慮して使用すると良いです。
副問合せに関する記述
© Hitachi, Ltd. 2013 , 2015. All rights reserved.
3-2 副問合せよりもジョインを使用する(1)
35
IN
副問合せ、ANY
副問合せ、ALL
副問合せでは作業表を作成します。また、副問合せ だと表の検索順序が限られるため、最も効率の良い順序で表を検索することができず、表の結合で記述したほうが処理の性能が向上することが多いです。IN副問合せ、=ANY 副問合せは、結合で記述できます。図 3-2-1、図 3-2-2に、副問合せを解消できる例を 示します。
Point
副問合せを用いないSQL
文に変更可能な場合、なるべく副問合せを使用しない○
SELECT ZA.SNAME FROM JUTYU DE, ZAIKO ZAWHERE DE.DNO = ZA.DNO AND ZA.ZSURYO = 20 ;
×
SELECT ZA.SNAME FROM ZAIKO ZA WHERE DNO IN (SELECT DE.DNO
FROM JUTYU DE) AND ZA.ZSURYO = 20 ;
副問合せを使用すると、作業表 オーバヘッド、さらにインデクスが 使えなければ直積相当の負荷が かかる。
ZAIKO
表を先に検索して絞り込みを 伝播させた方が良いが、JUTYU
表 を絞り込まずに先に検索してしまう。図 3-2-1 副問合せを使用しないSQL例 その1
副問合せを使用しないで、表結合 で実現。
(DE.DNOの値に重複がある場合 は注意が必要)
副問合せに関する記述
3-2 -1 副問合せよりもジョインを使用する(2)
○
SELECT ZA.SNAME FROM JUTYU DE, ZAIKO ZAWHERE DE.DNO = ZA.DNO AND DE.TCODE = 'A' ;
×
SELECT ZA.SNAME FROM ZAIKO ZA WHERE EXISTS ( SELECT *FROM JUTYU DE
WHERE DE.DNO = ZA.DNO AND DE.TCODE = 'A') ;
外への参照あり副問合せでは、
外側問合せを先に検索する。
ゆえに、外側問合せにデータの 絞り込みが無ければ、表の全件 の突合せが実施され負荷が高い。
図 3-2-2 副問合せを使用しないSQL例 その2
副問合せを使用しないで、表結合 で実現。
(
DE.DNO
の値に重複がある場合 は注意が必要)副問合せに関する記述
© Hitachi, Ltd. 2013 , 2015. All rights reserved.
3-3 FROM 句の副問合せの使用上の注意(1)
37
FROM
句の副問合せを指定すると、内部導出表を作成することが多くなります。内部導 出表を作成した場合、以下のような点で性能が悪くなるため、FROM
句の副問合せはな るべく用いないでください。例を図 3-3-1に示します。内部導出表は、FROM句の副問合せ結果で作成する作業表であるため、作業表へ
のI/O
が発生する。
内部導出表を作成すると、外側問合せに指定した探索条件は、FROM
句の副問合せ 結果で作成する作業表の作成後に評価するため、インデクスが用いられない。Point FROM
句の副問合せはなるべく用いない○
SELECT B.SNAME FROM JUTYU A, ZAIKO BWHERE A.DNO = B.DNO AND A.TCODE = 'A' ;
×
SELECT B.SNAMEFROM (SELECT DNO, TCODE FROM JUTYU WHERE TCODE='A') A,
(SELECT DNO, SNAME FROM ZAIKO) B WHERE A.DNO = B.DNO ;
内部導出表を作成する。
図 3-3-1
FROM
句に副問合せを使用しないSQL
例DNOにインデクスを定義し
ていても使用しない。DNO
のインデクスを用いた ネストループジョインとなる。副問合せに関する記述
3-3 -1 FROM 句の副問合せの使用上の注意(2)
×
SELECT P.*FROM TBL2 T2, (SELECT T1.* ,
VALUE(T1.C1S, T1.C1L, 0) C1 FROM TBL1 T1 ) P
WHERE T2.TBL1ID = P.ID
AND P.C1 BETWEEN T2.C2 AND T2.C3 AND T2.TBL2ID = ?
図 3-3-2 FROM句の副問合せの書き換えでの性能向上例
FROM句の
副問合せ。
○
SELECT T1.* ,VALUE(T1.C1S, T1.C1L, 0) C1 FROM TBL2 T2,
TBL1 T1
WHERE T2.TBL1ID = T1.ID
AND VALUE(T1.C1S, T1.C1L, 0)
BETWEEN T2.C2 AND T2.C3 AND T2.TBL2ID = ?
マージジョイン
作業表相手だと マージジョイン のみ。