コンパイラー書き直しの例: 操作のマージ
ビューを使用する 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 > 350002 つのビューからの 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 > 35000SQL および 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 の必要数が半分になります。