• 検索結果がありません。

副問合せに関する記述

ドキュメント内 HiRDB SQLコーディングガイドライン (ページ 34-39)

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 ZA

WHERE 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 ZA

WHERE 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 B

WHERE A.DNO = B.DNO AND A.TCODE = 'A' ;

×

SELECT B.SNAME

FROM (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 = ?

マージジョイン

作業表相手だと マージジョイン のみ。

ドキュメント内 HiRDB SQLコーディングガイドライン (ページ 34-39)