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;