0

このクエリでは:

 SELECT WTTEMPLATE.TEMPLATEuID,
                    MAX (WTTRX.VALUEDATE) AS template_last_use_date
               FROM wttemplate, wttrx
              WHERE WTTEMPLATE.TEMPLATEID = WTTRX.TEMPLATEID(+)
                    AND WTTEMPLATE.CUSTID = WTTRX.CUSTID
           GROUP BY WTTEMPLATE.TEMPLATEuID

EXPLAIN PLAN は次のことを示しています。私の質問は次のとおりです。フィルター基準を指定していないので、どのようにインデックスを使用できますか? フルスキャンを実行する必要があります...そうですか?

4

1 に答える 1

1

where句でTEMPLATEIDを使用しています。これが、Oracleがインデックスを使用して結合操作のルックアップを高速化する理由です。

ところで:しかし、WHERE句での暗黙的な結合の代わりに、標準のJOIN構文を使用することに実際に慣れるべきです。

SELECT wttemplate.templateuid,
       max (wttrx.valuedate) as template_last_use_date
FROM wttemplate 
   LEFT JOIN wttrx 
      ON wttemplate.templateid = wttrx.templateid
     AND wttemplate.custid = wttrx.custid
GROUP BY wttemplate.templateuid

結合構文を変更しても、実行プランは変更されません。これは明確さの問題であり、不要なデカルト結合のエラーが発生しにくくなっています。

于 2012-10-19T23:16:03.620 に答える