SQL コンパイラーは、 照会を最小限の操作数と述部数で構成しようとするため、 照会を書き直して照会操作を移動します。 以下の例に、SQL コンパイラーによって移動可能な操作をいくつか示します。
照会書き直し時に最適化プログラムで DISTINCT 操作が実行される場所を移動すると、 その操作のコストが少なくなることがあります。 この例では、DISTINCT 操作は完全に除去されます。
照会書き直し時に、述部を適用する順序を変更することによって、 できるだけ早い機会に、 もっと多くの選択述部が適用されるようにすることができます。
区分データベース環境にいる場合、 データベース区画間での結果セットの移動は高コストになります。 他のデータベース区画にブロードキャストする必要があるもののサイズ、 またはブロードキャストの数 (あるいは、その両方) を減らすことも、 照会の書き直し時の目標の 1 つです。
EMPNO 列を EMPLOYEE 表の基本キーとして定義した場合、次の照会は、
SELECT DISTINCT EMPNO, FIRSTNME, LASTNAME FROM EMPLOYEE
DISTINCT 文節を除去することで書き直されます。
SELECT EMPNO, FIRSTNME, LASTNAME FROM EMPLOYEE
上記の例では、基本キーが選択されているため、 SQL コンパイラーには返される各行がすでに固有であることがわかっています。 この場合、DISTINCT キーワードは不要です。 照会を書き直さないとすると、 最適化プログラムは必要な処理 (分類など) を含む計画を作成して、 列を一意にすることになります。
述部が通常適用されるレベルを変更すると、 パフォーマンスが向上する場合があります。 たとえば、部署 "D11" 内の従業員全員のリストを示す以下のような視点があるとします。
CREATE VIEW D11_EMPLOYEE (EMPNO, FIRSTNME, LASTNAME, PHONENO, SALARY, BONUS, COMM) AS SELECT EMPNO, FIRSTNME, LASTNAME, PHONENO, SALARY, BONUS, COMM FROM EMPLOYEE WHERE WORKDEPT = 'D11'
さらに、以下の照会があるとします。
SELECT FIRSTNME, PHONENO FROM D11_EMPLOYEE WHERE LASTNAME = 'BROWN'
コンパイラーの照会書き直し段階で、 述部 LASTNAME = 'BROWN' が視点 D11_EMPLOYEE にプッシュされます。 これにより、述部が早い時期におそらく効率的に適用されるようになります。 この例で実行可能な実際の照会は、次のようになります。
SELECT FIRSTNME, PHONENO FROM EMPLOYEE WHERE LASTNAME = 'BROWN' AND WORKDEPT = 'D11'
述部の後入れ先出しは、視点に限定されません。 述部が後入れ先出しされる可能性のあるこれ以外の状況には、 UNION、GROUP BY、派生表 (ネストされた表式や共通表式) があります。
区分データベース環境では、 SQL コンパイラーは次のような照会の書き直しを行う場合があります。
次の例では、 プログラミング・プロジェクトに従事している従業員のうち給与が低い人をすべて検索します。
SELECT P.PROJNO, E.EMPNO, E.LASTNAME, E.FIRSTNAME, E.SALARY+E.BONUS+E.COMM AS COMPENSATION FROM EMPLOYEE E, PROJECT P WHERE P.EMPNO = E.EMPNO AND P.PROJNAME LIKE '%PROGRAMMING%' AND E.SALARY+E.BONUS+E.COMM < (SELECT AVG(E1.SALARY+E1.BONUS+E1.COMM) FROM EMPLOYEE E1, PROJECT P1 WHERE P1.PROJNAME LIKE '%PROGRAMMING%' AND P1.PROJNO = A.PROJNO AND E1.EMPNO = P1.EMPNO)
この照会は相関しており、 また PROJECT と EMPLOYEE の両方が PROJNO 上に区分化されていないので、 各プロジェクトが各データベース区画にブロードキャストされます。 さらに、この副照会の評価を何回も行わなければなりません。
SQL コンパイラーは、照会を以下に示すように書き直します。
WITH DIST_PROJS(PROJNO, EMPNO) AS (SELECT DISTINCT PROJNO, EMPNO FROM PROJECT P1 WHERE P1.PROJNAME LIKE '%PROGRAMMING%')
AVG_PER_PROJ(PROJNO, AVG_COMP) AS (SELECT P2.PROJNO, AVG(E1.SALARY+E1.BONUS+E1.COMM) FROM EMPLOYEE E1, DIST_PROJS P2 WHERE E1.EMPNO = P2.EMPNO GROUP BY P2.PROJNO)
SELECT P.PROJNO, E.EMPNO, E.LASTNAME, E.FIRSTNAME, E.SALARY+E.BONUS+E.COMM AS COMPENSATION FROM PROJECT P, EMPLOYEE E, AVG_PER_PROG A WHERE P.EMPNO = E.EMPNO AND P.PROJNAME LIKE '%PROGRAMMING%' AND P.PROJNO = A.PROJNO AND E.SALARY+E.BONUS+E.COMM < A.AVG_COMP
書き直された SQL 照会では、 プロジェクトごとの AVG_COMP (AVG_PRE_PROJ) を計算し、 その結果を EMPLOYEE 表を含むデータベース区画すべてに同報通信することができます。