逆キー索引は、索引列のデータをビット単位で反転させ、その反転させたデータをソートして索引に格納します。このため、索引列の値が昇順で増加するようなINSERT処理を多重で実行した場合、索引のブロック競合を低減させることができます。
ただし、ビット反転されているため、“<”、“>”、“between”などの範囲検索では索引スキャンを行うことができません。逆キー索引を使用する場合は、検索処理のパターンを見極めたうえで使用する必要があります。
例えば、受注テーブルを考えてみます。受注番号はシーケンスを使用して昇順に値が振られ、多くの端末から同時にINSERT処理が実行されています。このとき、受注番号にB*Tree索引が作成されていると、図9のように索引ツリーの最後のブロックに挿入処理が集中してしまい、パフォーマンスが劣化する原因となってしまいます。
このような場合、逆キー索引を使用すると、連続したデータでも図10のように複数の索引ブロックに分散して挿入されることになるため、図9のような特定ブロックへのアクセス集中による競合を軽減できます。
以下の図11は、大量のINSERT処理を行った場合の、B*Tree索引と、逆キー索引での競合発生状況をV$WAITSTAT動的パフォーマンスビューの「data block」項目で確認したものです。
上記の例では、逆キー索引を使用することで待機回数が「1148回」、待機時間が「324.91秒」減少しています。ブロック競合をさらに減らすためには、表をハッシュ・パーティション化することも有効です。
Copyright © ITmedia, Inc. All Rights Reserved.