管理の手引き


操作のマージ

SQL コンパイラーは照会を書き直すことによって照会操作をマージし、 照会の SELECT 操作ができるだけ少なくなるよう試みます。 以下の例に、SQL コンパイラーによってマージ可能な操作をいくつか示します。

例 - 視点のマージ

EMPLOYEE 表に次の 2 つの視点でアクセスしているとしましょう。 一方は高学歴の従業員を表示する視点で、 他方は $35,000 以上の収入がある従業員を表示する視点です。

   CREATE VIEW EMP_EDUCATION (EMPNO, FIRSTNME, LASTNAME, EDLEVEL) AS
   SELECT EMPNO, FIRSTNME, LASTNAME, EDLEVEL
     FROM EMPLOYEE
    WHERE EDLEVEL > 17
   CREATE VIEW EMP_SALARIES (EMPNO, FIRSTNAME, LASTNAME, SALARY) AS
   SELECT EMPNO, FIRSTNME, LASTNAME, SALARY
     FROM EMPLOYEE
    WHERE SALARY > 35000

では、高学歴でかつ $35,000 以上の収入がある従業員をリストする照会を実行してみます。

   SELECT E1.EMPNO, E1.FIRSTNME, E1.LASTNAME, E1.EDLEVEL, E2.SALARY
     FROM EMP_EDUCATION E1,
          EMP_SALARIES  E2
    WHERE E1.EMPNO = E2.EMPNO

照会書き直し時に、これらの 2 つの視点をマージすると、 次の照会が作成されます。

   SELECT E1.EMPNO, E1.FIRSTNME, E1.LASTNAME, E1.EDLEVEL, E2.SALARY
     FROM EMPLOYEE E1,
          EMPLOYEE E2
    WHERE E1.EMPNO = E2.EMPNO
      AND E1.EDLEVEL > 17
      AND E2.SALARY  > 35000

2 つの視点からの SELECT ステートメントをユーザー作成の SELECT ステートメントとマージすることによって、 最適化プログラムはより多くのアクセス・プランの選択肢の中から選択できます。 さらに、マージした 2 つの視点の使う基本表が同じである場合、 例 - 余分な結合の除去での説明にしたがって追加の書き直しを実行できます。

例 - 副照会から結合への変換

SQL コンパイラーは、次のような副照会を含む照会がある場合、

   SELECT EMPNO, FIRSTNME, LASTNAME, PHONENO
   FROM EMPLOYEE
   WHERE WORKDEPT IN
         (SELECT DEPTNO
            FROM DEPARTMENT
           WHERE DEPTNAME = 'OPERATIONS')

これを次の形式の結合照会に変換します。

   SELECT DISTINCT EMPNO, FIRSTNME, LASTNAME, PHONENO
     FROM EMPLOYEE EMP,
          DEPARTMENT DEPT
    WHERE EMP.WORKDEPT = DEPT.DEPTNO
      AND DEPT.DEPTNAME = 'OPERATIONS'

一般に、結合は副照会を実行するよりはるかに効率的です。

例 - 余分な結合の除去

作成される、または生成される照会には、 しばしば不要な結合が含まれています。 例 - 視点のマージに記述されている照会書き直し段階で、 次のような照会が生成される可能性もあります。

   SELECT E1.EMPNO, E1.FIRSTNME, E1.LASTNAME, E1.EDLEVEL, E2.SALARY
     FROM EMPLOYEE E1,
          EMPLOYEE E2
    WHERE E1.EMPNO = E2.EMPNO
      AND E1.EDLEVEL > 17
      AND E2.SALARY  > 35000

この照会では、SQL コンパイラーは結合を除去して、 照会を次のように簡略化することができます。

   SELECT EMPNO, FIRSTNME, LASTNAME, EDLEVEL, SALARY
     FROM EMPLOYEE
    WHERE EDLEVEL > 17
      AND SALARY  > 35000

次の例では、部門番号の EMPLOYEE サンプル表と DEPARTMENT サンプル表との間に、 参照制約が存在すると想定しています。 まず視点を作成します。

   CREATE VIEW PEPLVIEW
      AS SELECT FIRSTNME, LASTNAME, SALARY, DEPTNO, DEPTNAME, MGRNO
            FROM EMPLOYEE E DEPARTMENT D
            WHERE E.WORKDEPT = D.DEPTNO

それから、次のような照会を作成します。

   SELECT LASTNAME, SALARY
      FROM PEPLVIEW

この照会は、次のようになります。

   SELECT LASTNAME, SALARY
      FROM EMPLOYEE
      WHERE WORKDEPT NOT NULL

この状態では、照会を書き直せることが分かっていても、 基礎表へのアクセス権がないため、書き直すことはできません。 持っているのは、視点へのアクセス権だけです (上記参照)。 したがって、このタイプの最適化は、 データベース・マネージャー内で実行する必要があります。

次のような場合、参照保全結合は冗長になる可能性があります。

例 - 共用集約

照会の中で複数の関数を使用すると、複数の計算が生成されますが、 これは場合によってはかなり時間を要します。 照会内で行う計算の数を減らすことによって、計画を改善することができます。 たとえば、以下のような複数の関数を使用する照会があるとします。

   SELECT SUM(SALARY+BONUS+COMM) AS OSUM,
     AVG(SALARY+BONUS+COMM) AS OAVG,
     COUNT(*) AS OCOUNT
   FROM EMPLOYEE;

SQL コンパイラーは、この照会を次のように変換します。

   SELECT OSUM,
     OSUM/OCOUNT
     OCOUNT
   FROM (SELECT SUM(SALARY+BONUS+COMM) AS OSUM,
     COUNT(*) AS OCOUNT
   FROM EMPLOYEE) AS SHARED_AGG;

この書き直しによって、 照会の関数は、2 つの SUM と 2 つの COUNT から 1 つの SUM と 1 つの COUNT に減らされます。


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