データ・ブロック・プリフェッチによるパフォーマンス向上

データ・ブロック・プリフェッチは、Oracle9i で提供される「隠れた」パフォーマンス機能の一例です。 この機能は、エンドユーザーとデータベース管理者の両方に対して完全に透過的ですが、個別の問合せ性能を30%またはそれ以上向上させることができます。

データ・ブロック・プリフェッチは、Bツリー索引を使用して多数の行を取出す問合せ性能を大幅に改善します。 データ・ブロック・プリフェッチは、「クラスタ化が徹底されていない」索引を使用する問合せに対して最も大きなパフォーマンス上の 利点をもたらします。(基礎となる表のデータが索引キーと同じ順序である索引を「クラスタ化されている」といいます。 クラスタ化の徹底されていない索引とは、基礎となる表の行が索引キーとはまったく異なる順序である索引です。)
ほとんどの表にはクラスタ化された索引は多くても1つしかないため、クラスタ化の徹底されていない索引が非常によく見られます。

これまで、クラスタ化の徹底されていないBツリー索引を使用した多数の行へのアクセスは高負荷になることがありました。 索引によってアクセスされる各行は別のデータ・ブロックにあることが多く、別のI/O処理が必要でした。I/Oが表全体に分散し、 バッファ・キャッシュのヒット率が低くなるため、このような問合せにはバッファ・キャッシュは非効率的です。
このような場合、システムに使用可能なI/O帯域幅がある場合でも1度に1つのデータ・ブロックがキャッシュに読み取られるのを 待機することになり、問合せはI/Oバウンドになりやすくなります。

データ・ブロック・プリフェッチでは、Oracleは1度に1つのデータ・ブロックを読取るのではなく、基礎となる索引によって 指定された複数行がアクセス可能になるまでデータ・ブロックの読取りを遅らせ、その後に複数のデータ・ブロックを1度に取出します。 ブロックのプリフェッチにより、I/O容量をよりよく利用することができ、必要な限りI/O操作をパラレルで発行することによって 応答時間がさらに短縮されます。
TPC-Hベンチマークの問合せ17は、データ・ブロックのプリフェッチを使用したよい例です。 この問合せにおけるビジネスの質問は、次のようなものです。特定のブランドと特定の容器タイプについて、これらの部品の平均注文数の 20%未満が今後入荷されなくなるとしたら、年間の収入における平均損失はいくらになるか?

この問合せは、次のSQL文を使用して表すことができます。

SELECT
SUM(l_extendedprice) / 7.0 AS avg_yearly
FROM
parts,
lineitem l1
WHERE
p_partkey = l_partkey
AND p_brand = 'Brand#23'
AND p_container = 'MED BOX'
AND l_quantity <
(SELECT 0.2 * AVG(l_quantity) FROM lineitem l2
WHERE l_partkey = p_partkey);

Oracle8i とOracle9i のいずれにおいても、この問合せを実行する効率的な方法はlineitem.l_partkeyに索引付けすることです。

Oracle8i では、この問合せには264秒かかります。Oracle9i で同じハードウェア構成と同じ実行計画でこの問合せを実行すると、 180秒かかります。データ・ブロック・プリフェッチにより、この索引の多い問合せ性能は30%以上向上しました。

データ・ブロック・プリフェッチは、Oracle9iでパフォーマンスが改善されている多数の機能の一例に過ぎません。

追加情報
 Business Intelligence (データ・ウェアハウス) - DSS環境におけるOracle9iのパフォーマンスと拡張性(ホワイトペーパー)

Oracle9i Database Daily Feature
 アーカイブ