SQL コンパイラーは照会を書き直すことによって照会操作をマージし、 照会の SELECT 操作ができるだけ少なくなるよう試みます。 以下の例に、SQL コンパイラーによってマージ可能な操作をいくつか示します。
SELECT ステートメントで視点を使用すると、 表の結合順序が制限されることがあり、 また余分な表結合が生成される可能性もあります。 照会書き直し時に視点をマージするなら、 これらの制限事項を除くことができます。
最適化プログラムが SELECT ステートメントの中に副照会を検出すると、 表の処理順序の選択に関して制限を受ける場合があります。
照会書き直し時に、余分な結合を除去して、 最適化対象の 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 コンパイラーは、次のような副照会を含む照会がある場合、
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 に減らされます。