SQL 解説書

OPTIMIZE FOR 文節

>>-OPTIMIZE FOR--integer----+-ROWS-+---------------------------><
                            '-ROW--'
 

OPTIMIZE FOR 文節は、選択ステートメント の特殊な処理を要求します。 この文節が省略されると、結果表のすべての行が検索されることが想定されます。 指定されている場合には、 検索される行数はおそらく n を超えないことを前提としています。 ここで、n整数 の値です。 n の値は、正の整数でなければなりません。 OPTIMIZE FOR 文節を使用すると、 n 個の行が検索されることを前提とする照会の最適化に影響を与えます。 さらに、ブロックされているカーソルの場合、 この文節は、各ブロックで戻される行の数に影響を与えます (すなわち、 各ブロックで戻される行の数は n 行以下になります)。 fetch-first-clauseoptimize-for-clause の両方が指定されている場合には、 これらの文節の integer 値のうちの小さい方を使用して通信バッファー・サイズが決定されます。 これらの値は最適化処理専用です。

この文節を指定しても、取り出される行の数が制限されることはなく、 パフォーマンス以外ではどんな点でも結果に影響を与えることはありません。 OPTIMIZE FOR n ROWS を使用した場合、 n 個以下の行を取り出す場合にはパフォーマンスが向上することがありますが、 n 個を超える行を取り出す場合にはパフォーマンスが低下する可能性があります。

n に行のサイズを乗算した値が通信バッファーのサイズを超えると 55 、OPTIMIZE FOR 文節はデータ・バッファーに影響を与えません。

選択ステートメントの例

例 1: EMPLOYEE 表からすべての列と行を選択します。

    SELECT * FROM EMPLOYEE

例 2: PROJECT 表からプロジェクト名 (PROJNAME)、開始日 (PRSTDATE)、 および終了日 (PRENDATE) を選択します。 その日付が最新の終了日から順に結果表を配列します。

    SELECT PROJNAME, PRSTDATE, PRENDATE
                FROM PROJECT          
   ORDER BY PRENDATE DESC

例 3: EMPLOYEE 表のすべての部門の部門番号 (WORKDEPT) と部門別給与 (SALARY) の平均額を選択します。 結果表は、部門別給与の平均額の昇順に配列します。

    SELECT WORKDEPT, AVG(SALARY)
     FROM EMPLOYEE   
     GROUP BY WORKDEPT 
     ORDER BY 2

例 4: C プログラムで使用する UP_CUR という名前のカーソルを宣言して、 PROJECT 表の開始日 (PRSTDATE) と終了日 (PRENDATE) の列を更新します。 プログラムは、各行のこれらの 2 つの値と、 プロジェクト番号 (PROJNO) とを受け取る必要があります。

  EXEC SQL  DECLARE UP_CUR CURSOR FOR
              SELECT PROJNO, PRSTDATE, PRENDATE
           FROM PROJECT
                FOR UPDATE OF PRSTDATE, PRENDATE;

例 5: この例では、SAL+BONUS+COMM に TOTAL_PAY という名前を付けます。

      SELECT SALARY+BONUS+COMM AS TOTAL_PAY
     FROM EMPLOYEE
     ORDER BY TOTAL_PAY

例 6: セールス担当員の従業員番号と給与、およびその部門の給与平均額と人数とを調べます。 また、部門別給与平均額と、平均額の最高値も調べます。

ここでは、共通表式を使用することによって、 DINFO 視点を正規の視点として作成したときのオーバーヘッドを軽減します。 ステートメントの作成中に、視点のカタログにはアクセスされません。 これは、全選択の残りの部分の文脈により、 視点によって考慮する必要があるのはセールス担当の部門の行だけだからです。

  WITH
    DINFO (DEPTNO, AVGSALARY, EMPCOUNT) AS
        (SELECT OTHERS.WORKDEPT, AVG(OTHERS.SALARY), COUNT(*)
          FROM EMPLOYEE OTHERS
           GROUP BY OTHERS.WORKDEPT
        ),
    DINFOMAX AS
        (SELECT MAX(AVGSALARY) AS AVGMAX FROM DINFO)
 SELECT THIS_EMP.EMPNO, THIS_EMP.SALARY,
        DINFO.AVGSALARY, DINFO.EMPCOUNT, DINFOMAX.AVGMAX
  FROM EMPLOYEE THIS_EMP, DINFO, DINFOMAX
  WHERE THIS_EMP.JOB = 'SALESREP'
  AND THIS_EMP.WORKDEPT = DINFO.DEPTNO


脚注:

55
通信バッファーのサイズは、RQRIOBLK または ASLHEAPSZ 構成パラメーターによって定義されます。 詳細については、管理の手引き を参照してください。


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