索引の使い分けでパフォーマンスを向上できるケース:Oracle SQLチューニング講座(9)(3/4 ページ)
本連載では、Oracleデータベースのパフォーマンス・チューニングの中から、特にSQLのチューニングに注目して、実践レベルの手法を解説する。読者はOracleデータベースのアーキテクチャを理解し、運用管理の実務経験を積んでいることが望ましい。対象とするバージョンは現状で広く使われているOracle9iの機能を基本とするが、Oracle 10gで有効な情報も随時紹介していく。(編集局)
逆キー索引の使用
逆キー索引は、索引列のデータをビット単位で反転させ、その反転させたデータをソートして索引に格納します。このため、索引列の値が昇順で増加するような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.