コンパイラー書き直しの例: 操作のマージ

ビューを使用する SELECT ステートメントでは、 表の結合順序が制限されたり、余分な表結合が生成されたりすることがあります。 照会書き直し時にビューをマージすれば、これらの制限事項を除くことができます。

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 および XQuery コンパイラーは、次のような副照会を含む照会がある場合、
   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 および XQuery コンパイラーは結合を除去して、照会を次のように簡略化することができます。
   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
これが次のようにトランスフォームされます。
   select osum, osum/ocount ocount
     from (
       select sum(salary+bonus+comm) as osum,
           count(*) as ocount
         from employee
     ) as shared_agg
この書き直しによって、sum と count の必要数が半分になります。