順序付けの最適化

このセクションでは、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
SALES が末尾キーとして追加された場合、索引専用アクセスが両方の照会で使用されます。
CREATE INDEX SALES_IMOX ON SALES (SALES_DATE, REGION, SALES_PERSON, SALES)
最適化プログラムは、照会を実行する際により多くの索引を検討できるようになりました。 また、一時索引にキー列として追加される列の数は減少しています。 次の SQL 例は、最適化プログラムが順序付けの列を除去できる可能性のある照会を示しています。
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
変更の終わり