ソートを回避するための索引

索引には、データへのアクセスを選択できる他に、場合によってはデータをソートせずに配列することもできます。

プログラム固有のプログラミングインターフェース情報の開始。索引キーが、ORDER BY、GROUP BY、結合操作、または、集約関数内のDISTINCTで必要な順序になっている場合は、いくつかのソートを避けることができます。 それ以外の場合 (例えば、リスト・プリフェッチを使用する場合)、その索引では有効なデータ順序付けを提供できないため、選択したデータをソートする必要が生じることがあります。

ソートを絶対に避ける必要があるときは、目的の順序付けを行うために 必要な列 (1 つ以上) に索引を作ることを検討してください。 また、節OPTIMIZE FOR 1 ROWを使用して、Db2が、アクセス・パスのソートを選択するのを阻止することも検討します。

次のような照会を行ったとします。

SELECT  C2, SUM(C3)
FROM T1
WHERE C1 = 17
GROUP BY C2;

C1 の昇順インデックス、または ( C1,C2,C3® ) のインデックスを使用すれば、ソートを省略できる可能性があります。

逆方向索引スキャン

場合によっては、Db2は、降順索引で逆方向索引スキャンを使用して、昇順データのソートを回避することができます。 同様に、降順データのソートをしなくてすむように、昇順索引を使用できます。 Db2が、逆方向索引スキャンを使用するには、以下の条件が真でなければなりません。

  • 索引には、ORDER BY 文節内の列が、ORDER BY 文節でその列が発生する同じ順序で 入っています。
  • この順序状態にある各列は、ORDER BY 文節の反対の順序 (ASC または DESC) である必要があります。

例: 逆方向索引スキャン

ACCT_STAT 表には ある索引が存在するものとします。 この索引は、ACCT_NUM、STATUS_DATE、STATUS_TIME の列によって 定義されます。 この索引内の列は、すべて昇順です。 ここで、次の SELECT ステートメントを考えます。

SELECT STATUS_DATE, STATUS
  FROM ACCT_STAT
  WHERE ACCT_NUM = :HV
  ORDER BY STATUS_DATE DESC, STATUS_TIME DESC;
SELECT STATUS_DATE, STATUS
  FROM ACCT_STAT
  WHERE ACCT_NUM = :HV
  ORDER BY STATUS_DATE ASC, STATUS_TIME ASC;

逆方向索引スキャンを使用すると、Db2は、両方のステートメントに同じ索引を使用することができます。

ランダム化された索引キー列

ランダム化されたキー列が ORDER BY 文節に含まれていない限り、RANDOM オプションを使用して、そのランダム化されたキー列で索引を作成して、ソートを回避することもできます。

例: ランダム化された索引キー列

ランダム化されたキーと一緒に索引を使用すると、GROUP BY 処理を使用する照会でソートを回避することができます。 以下のステートメントを考えてみます。

CREATE INDEX I1
ON T1(C1, C2 RANDOM, C3);
SELECT  C2, SUM(C3)
FROM T1
WHERE C1 = 17
GROUP BY C2;

この照会は索引 I1 を使用できます。これは、元の列 C2 の等しい値がすべて索引に連続して保管され、同一のランダム値が保管されているからです。 照会の出力の順序は (ASC または DESC 索引が使用された場合の出力とは対照的に) 任意であるように見えますが、結果の正確さは影響を受けません。 アプリケーションに対して結果の組が表される順序のみが、ランダム化による影響を受けます。 結果を順に表示したい場合は、ORDER BY ステートメントを使用して順序を強制する必要があります。これには、ソートが必要です。

ソートの方が効率的な場合

もちろん、必ずしも、すべてのソートが非効率なわけではありません。 例えば、ソートするための 索引があまり効率がよくなく、条件を満たす行が 多数ある場合、別のアクセス・パスを使ってデータを取り出してから、 そのデータをソートした方が非効率な順序付け索引よりも効率的です。

ソートを回避するために作成された索引は、 非選択となる場合もあります。 これらの索引がデータ・アクセスを必要とし、かつクラスター比率が不十分であると、 選択されない可能性があります。 クラスター比率が不十分な索引を使用して多数の行にアクセスする方が、 表スペース・スキャンおよびソートを使用して行にアクセスする場合より、 往々にして効率が悪くなります。 両方の表スペース・スキャンと、順次アクセスからのソートの利点。プログラム固有のプログラミングインターフェース情報を終了します。