順序付けの最適化
このセクションでは、DB2® for i がどのようにして順序付けの方法を実施するかについて述べるとともに、 Query 最適化プログラムが行う最適化選択方法について説明します。 Query 最適化プログラムは、索引順序付けまたは分類のいずれかを使用して、順序付けを実行することができます。
ソート順序付けの実行
ソート・アルゴリズムは、行をソート・スペースに読み込んで、指定された順序付けキーに基づいて行をソートします。 その後、行は順序付けソート・スペースからユーザーに戻されます。
索引順序付けの実行
索引順序付けの実行は、隣接する左端のキー列として順序付けする列がすべて含まれる索引を必要とします。 データベース・マネージャーは、索引を介して索引順に個々の行をアクセスします。 この結果、行が要求元に戻されることになります。
この方法は、アプリケーションが順序付けの結果のすべての取り出しを必要としない場合、あるいは順序付け列に一致する索引が存在している場合に効果的です。順序付けが索引を使用して実行され、順序付け列を満たす永続索引が存在しないときに、一時索引が作成されます。照会内に指定された順序付け列は索引のキー列として使用されます。
索引マージ順序付けの実行
索引マージ順序付けでは、索引を使用して選択 を適用してから索引付きリストを使用して行をソートすることで、索引とソ ートの両方の順序付けの機能の一部を利用します。この最適化は主に、最適化ゴールが *FIRSTIO である照会向けであり、WHERE 節の選択には不等号述部が含まれます。
順序付け列を除去することによる順序付けの最適化
すべての順序付け列は、順序付けの列のリストから除去できるかを判別するために評価されます。 等号演算子が指定された分離可能選択述部を持つこれらの順序付け列のみが、 検討されます。 これにより列が単一の値だけに一致でき、順序付けの限定に役立たないことを保証します。
- ORDER BY リストにない等号述部が含まれている列は、索引の最初のキーにする必要があります。
- その後に、ORDER BY リストにない不等号述部の列が続きます。等号述部列に続けて、最も選択的な述部の列が最初に来るように列を配置する必要があります。
- その後に、照会の ORDER BY 節と同じ順序で同じ ASC または DESC 属性を持つ ORDER BY 列が続きます。
- オプションとして、最後に、他の選択列、または索引専用アクセス用の他の選択された列を含めることができます。
SELECT * FROM SALES
WHERE SALES_DATE BETWEEN '1996-03-29' AND '1996-04-29'
AND REGION IN ('Quebec','Manitoba')
ORDER BY SALES_PERSON
SALES_DATE, REGION, SALES_PERSON
SELECT SALES_DATE, REGION, SALES_PERSON, SALES
FROM SALES
WHERE REGION IN ('Quebec','Manitoba')
ORDER BY SALES_PERSON
CREATE INDEX SALES_IMOX ON SALES (SALES_DATE, REGION, SALES_PERSON, SALES)
DECLARE DEPTEMP CURSOR FOR
SELECT EMPNO, LASTNAME, WORKDEPT
FROM CORPDATA.EMPLOYEE
WHERE EMPNO = '000190'
ORDER BY EMPNO, LASTNAME, WORKDEPT
付加順序付け列を追加することによる順序付けの最適化
順序付け列の除去の場合に適用されるのと同じロジックが、照会に付加グループ化列を追加するためにも使用されることがあります。 このロジックは、索引が順序付けの実行に使用できるか判別しようとする場合にのみ実行されます。
CREATE INDEX X1 ON EMPLOYEE (LASTNAME, EMPNO, WORKDEPT)
DECLARE DEPTEMP CURSOR FOR
SELECT LASTNAME, WORKDEPT
FROM CORPDATA.EMPLOYEE
WHERE EMPNO = '000190'
ORDER BY LASTNAME, WORKDEPT
この照会要求については、最適化プログラムがこの照会に X1 が考慮された ときに、EMPNO を追加の順序付け列として追加することができます。
逆順索引を使用した索引順序付けの実行
逆順索引を使用して順序付けを提供することも可能です。その場合、すべての ORDER BY 列の索引キーを逆順にする必要があります。データベース・マネージャーは、末尾から索引を逆方向に読み取って、索引を逆順に処理します。
CREATE INDEX CORPDATA.INDEX1 ON CORPDATA.EMPLOYEE (SALARY ASC, LASTNAME DESC)
SELECT EMPNO, LASTNAME, WORKDEPT, SALARY
FROM CORPDATA.EMPLOYEE
ORDER BY SALARY DESC, LASTNAME ASC