管理の手引き


述部の変換

SQL コンパイラーは照会を書き直して、 特定の照会に関して既存の述部をより最適化された述部に変換します。 以下の例に、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 から IN への変換

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 処理については、 複数の索引アクセスを参照してください。


[ ページのトップ | 前ページ | 次ページ | 目次 | 索引 ]