SQL コンパイラーは照会を書き直して、 特定の照会に関して既存の述部をより最適化された述部に変換します。 以下の例に、SQL コンパイラーが変換できる述部をいくつか示します。
照会の書き直し時に述部をその照会に追加することによって、 最適化プログラムが照会の最適アクセス・プランを選択するときに、 追加の表結合についても検討できるようになります。
照会書き直し時に、OR 述部を IN 述部に変換すると、 より効率的なアクセス・プランを選択できるようになる場合があります。 また、IN 述部を OR 述部に変換することが一層効率的なアクセス・プランの選択を可能にするのであれば、 SQL コンパイラーでそのような変換をすることもできます。
以下の照会は、"E01" に報告する部門のマネージャー、 およびそれらのマネージャーが担当するプロジェクトのリストを生成するものです。
SELECT DEPT.DEPTNAME DEPT.MGRNO, EMP.LASTNAME, PROJ.PROJNAME FROM DEPARTMENT DEPT, EMPLOYEE EMP, PROJECT PROJ WHERE DEPT.ADMRDEPT = 'E01' AND DEPT.MGRNO = EMP.EMPNO AND EMP.EMPNO = PROJ.RESPEMP
照会書き直しにより、以下の暗黙の述部が追加されます。
DEPT.MGRNO = PROJ.RESPEMP
この書き直しの結果、 最適化プログラムがこの照会に最適のアクセス・プランを選択するとき、 考慮できる結合の種類が増えることになります。
前述の述部移動のほかにも、照会書き直しでは、 等号述部によって暗黙のうちに示される移動に基づいて、 さらに別のローカル述部が導出されます。 たとえば、以下の照会は、 部門 (部門番号が "E00" より大きいもの) の名前、 およびその部門で働く従業員の名前のリストを作成するものです。
SELECT EMPNO, LASTNAME, FIRSTNAME, DEPTNO, DEPTNAME FROM EMPLOYEE EMP, DEPARTMENT DEPT WHERE EMP.WORKDEPT = DEPT.DEPTNO AND DEPT.DEPTNO > 'E00'
この照会では、照会書き直し段階で、以下の暗黙の述部が追加されます。
EMP.WORKDEPT > 'E00'
この書き直しの結果として、最適化プログラムは結合する行の数を減らします。
OR 文節が、次の例のように同じ列にある 2 つ以上の単純等価述部を結合する場合を考えてみましょう。
SELECT * FROM EMPLOYEE WHERE DEPTNO = 'D11' OR DEPTNO = 'D21' OR DEPTNO = 'E21'
DEPTNO 列に索引が存在しない場合、OR 文節を次のような IN 述部に変換すると、 照会をより効率的に処理できるようになります。
SELECT * FROM EMPLOYEE WHERE DEPTNO IN ('D11', 'D21', 'E21')
注: | 場合によっては、データベース・マネージャーは IN 述部を一連の OR 述部に変換して、 索引 OR 処理を実行できるようにすることがあります。 索引 OR 処理については、 複数の索引アクセスを参照してください。 |