>>-OPTIMIZE FOR--integer----+-ROWS-+--------------------------->< '-ROW--'
OPTIMIZE FOR 文節は、選択ステートメント の特殊な処理を要求します。 この文節が省略されると、結果表のすべての行が検索されることが想定されます。 指定されている場合には、 検索される行数はおそらく n を超えないことを前提としています。 ここで、n は整数 の値です。 n の値は、正の整数でなければなりません。 OPTIMIZE FOR 文節を使用すると、 n 個の行が検索されることを前提とする照会の最適化に影響を与えます。 さらに、ブロックされているカーソルの場合、 この文節は、各ブロックで戻される行の数に影響を与えます (すなわち、 各ブロックで戻される行の数は n 行以下になります)。 fetch-first-clause と optimize-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