10.1 統計を使用した問合せの最適化

統計を使用して問合せを最適化する場合は、問合せ表および索引に関して収集された統計を使用して、その問合せを最も効率的に処理できる実行計画が選択されます。一般に、問合せパフォーマンスの改善が必要な場合は、元表に関する統計を収集することをお薦めします。統計を使用して最適化を行うと、CONTAINS述語の選択性およびコストをより正確に見積ることができるため、より適切な実行計画が選択されます。

オプティマイザは、次のパラメータに基づいて最適な実行計画を選択します。

  • CONTAINS述語の選択性

  • 同じ問合せに含まれるその他の述語の選択性

  • CONTAINS述語を処理したときのCPUコストとI/Oコスト

次の各項では、統計を拡張可能問合せオプティマイザで使用する方法を説明します。

ノート:

Oracle Text索引などの、ドメイン索引に関する統計のインポートおよびエクスポートは、DBMS_STATSパッケージではサポートされていません。統計のインポートおよびエクスポートの詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。

関連項目:

CONTAINS問合せ演算子の詳細は、『Oracle Textリファレンス』を参照してください

10.1.1 統計の収集

デフォルトでは、Oracle Textはコストベース・オプティマイザ(CBO)を使用し、問合せに対する最適な実行計画を決定します。

オプティマイザを使用して最適なコストを見積るには、問い合せた表の統計を計算します。

ANALYZE TABLE <table_name> COMPUTE STATISTICS;

あるいは、次のように表のサンプルの統計を見積ります。

ANALYZE TABLE <table_name> ESTIMATE STATISTICS 1000 ROWS;

または

ANALYZE TABLE <table_name> ESTIMATE STATISTICS 50 PERCENT;

統計の収集は、DBMS_STATS.GATHER_TABLE_STATSプロシージャを使用してパラレルに行うこともできます。

begin
 
DBMS_STATS.GATHER_TABLE_STATS('owner', 'table_name',
                                       estimate_percent=>50,
                                       block_sample=>TRUE,
                                       degree=>4) ;
 
end  ;

これらの文は、table_name,に関連付けられたすべてのオブジェクトの統計を収集します。オブジェクトには、その表の列とその表に関連付けられたすべての索引(Bツリー、ビットマップまたはテキスト・ドメイン)も含まれます。

表の統計を再収集するには、ANALYZE文を必要な回数入力するか、DBMS_STATSパッケージを使用します。

テキスト・ドメイン索引の統計を収集することによって、Oracle DatabaseのCBOでは、次のタスクを実行できます。

  • CONTAINS述語の選択性の見積り

  • Oracle Text索引を使用したときのI/OコストとCPUコスト(ドメイン索引を使用してCONTAINS述語を処理するときのコスト)の見積り

  • CONTAINSの起動ごとのI/OコストとCPUコストの見積り

CONTAINS述語の選択性がわかっていると、構造化問合せなど、複数の述語が含まれた問合せを行う場合に役立ちます。このように、CBOでは、ドメイン索引を使用してCONTAINSを評価するか、あるいはCONTAINS述語をポスト・フィルタとして適用するかを、より適切に判断できます。

関連項目:

  • ANALYZE文の詳細は、『Oracle Database SQL言語リファレンス』を参照してください。

  • DBMS_STATSパッケージの詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。

10.1.2 統計による問合せ最適化の例

次の構造化問合せは、統計を最適化する例です。

select score(1) from tab where contains(txt, 'freedom', 1)  > 0 and author = 'King' and year > 1960;

次のことを前提にしています:

  • author列はVARCHAR2型で、year列はNUMBER型です。

  • author列にはBツリー索引があります。

  • 構造化述語authorは、CONTAINS述語およびyear述語と比較してきわめて厳密です。つまり、構造化述語(author = 'King')は、year述語およびCONTAINS述語と比較して、かなり少ない数の行(たとえば、それぞれ1000行および1500行に対して5行)を戻すと想定します。

このような状況の場合、Oracle Textでは、最初に構造化述語(author = 'King')にBツリー索引のレンジ・スキャンを行い、次にROWIDで表アクセスを行ってから、Bツリーの表アクセスから戻された行に他の2つの述語を適用することで、この問合せをより効率的に行うことができます。

ノート:

Oracle Text索引の統計が収集されていない場合、CBOはCONTAINS述語の選択性と索引コストが低いものとみなします。

10.1.3 統計の再収集

索引を同期化した後、単一の索引の統計を再収集して、コストの見積りを更新できます。

同期化の前に元表が再解析された場合は、同期化の後に表全体を再解析しなくても、索引を解析するのみで十分です。

統計を再収集するには、次のいずれかの文を入力します。

ANALYZE INDEX <index_name> COMPUTE STATISTICS;
ANALYZE INDEX <index_name> ESTIMATE STATISTICS SAMPLE 50 PERCENT;

10.1.4 統計の削除

表に関連付けられている統計を削除します。

ANALYZE TABLE <table_name> DELETE STATISTICS;

1つの索引の統計を削除します。

ANALYZE INDEX <index_name> DELETE STATISTICS;