0

次のクエリがあります。これは、それぞれが 100 万行を超える複数のテーブルを結合します。

Select * From TableA A
LEFT JOIN TableB B ON A.col1 = B.col1 
INNER JOIN TableC C ON C.col2 = B.col2
INNER JOIN TableD D ON D.col2 = C.col2
INNER JOIN TableE E ON E.col1 = B.col1 
INNER JOIN (Select * From TableF F JOIN TableG G ON F.ID=G.ID) FG 
                          ON  FG.cId = E.cId AND FG.custID = C.custID
WHERE C.ACCEPTED = 'Y'
AND D.colx IS NULL
AND D.coly IS NULL 
And D.START_DATE <= A.SD
And D.END_DATE >= A.SD

これには時間がかかりすぎたので、これを最適化することに決め、次のように思いつきました。

Select * From TableA A
INNER JOIN TableE E ON E.col1 = A.col1 
INNER JOIN (Select * From TableF F JOIN TableG G ON F.ID=G.ID) FG 
                              ON FG.cID = C.cID AND  FG.custID = 
                                              (Select custID From 
                                   TableB B 
                                   TableC C ON C.col2 = B.col2
                                   TableD D ON D.col2 = C.col2
                                   WHERE C.ACCEPTED = 'Y'
                                   AND D.colx IS NULL
                                   AND D.colx IS NULL 
                                   And D.START_DATE <=  A.SD
                                   And D.END_DATE >=  A.SD
                                   AND B.col1 = A.col1                                                 
                                   AND rownum = 1
                                  )

これによりクエリが改善されましたが、2つのクエリが同じ結果をもたらすかどうかはわかりません(いくつかのシナリオをテストしましたが、結果は同じように見えますが、すべてのテーブルに何百万もの行が含まれているため、各行を調べて比較することはできません)、そして、これらすべてのテーブルを結合する代わりに、2 番目のテーブルで行ったようにサブクエリから custId を取得するだけでよいでしょうか?

ありがとう

4

0 に答える 0