10.10 索引付けのパフォーマンスに関するFAQ(よくある質問)
この項では、索引付けのパフォーマンスに関してよくある質問と、それに対する回答を提供します。
10.10.1 索引付けにはどのくらいの時間が必要ですか。
回答: テキストの索引付けは、リソース集中型の処理です。索引付けの速度はハードウェアの性能に依存します。索引付けの速度はCPUおよびI/O容量により異なります。元のデータの読込みや索引エントリの書込みに十分なI/O容量がある場合、CPUが制限要素となります。
Intel x86 (Core 2アーキテクチャ、2.5GHz) CPUを使用したテストでは、Oracle Textでは1日当たりCPUコアごとに約100GBのテキストを索引付けできました。この速度になると、CPUクロック速度が増し、CPUアーキテクチャがさらに効率的になることが予想されます。
ドキュメント形式、データの場所、ユーザー定義データストアのコール、フィルタ、レクサーなどのその他の要因も、索引付けの速度に影響します。
10.10.2 どの索引メモリー設定を使用すればよいですか。
回答: 索引メモリーは、DEFAULT_INDEX_MEMORY
およびMAX_INDEX_MEMORY
システム・パラメータを使用して設定できます。また、CREATE INDEX
のパラメータ文字列にmemory
パラメータを指定して、索引メモリーを実行時に設定することもできます。
DEFAULT_INDEX_MEMORY
値は、ページングが発生しない範囲で、できるだけ高く設定するようにします。
SORT_AREA_SIZE
システム・パラメータを増やして、索引付けのパフォーマンスを向上させることもできます。
索引メモリーの設定を大きくすることをお薦めします。数百MBまで設定を大きくすると、索引付けの速度が上がり、最終的な索引の断片化が減少します。ただし、索引メモリー設定を高くしすぎると、メモリーのページングが発生して索引付けの速度が低下します。
索引のパラレル作成では、各プロセスがそれぞれ索引付け用のメモリーを必要とします。巨大な表を扱う場合には、索引作成時と検索時とで、システム・グローバル領域(SGA)のチューニング方法を変えます。問合せでは、SGAのブロック・バッファ・キャッシュにできるだけ多くの情報をキャッシュするようにします。このため、ブロック・バッファ・キャッシュには大量のメモリーを割り当てる必要があります。このアプローチは索引付けには影響を与えないため、索引付け中は、SGAのサイズを減らして、索引メモリー設定を大きくする方が賢明です。
SGAのサイズはOracle Database初期化ファイルで設定します。
関連項目:
-
Oracle Textのシステム・パラメータについてさらに学習するには、『Oracle Textリファレンス』を参照してください。
-
メモリー割当ての詳細は、『Oracle Databaseパフォーマンス・チューニング・ガイド』を参照してください。
-
SORT_AREA_SIZE
パラメータの詳細は、『Oracle Databaseリファレンス』を参照してください。
10.10.3 索引付けにはどの程度のディスク・オーバーヘッドが必要ですか。
回答: オーバーヘッド(索引表に必要な領域の量)は、元のテキスト量の50%から200%までの範囲で様々です。一般に、テキストの総量が多いほどオーバーヘッドは小さくなりますが、小さなレコードが多数ある方が、大きなレコードが少数あるよりもオーバーヘッドの消費が大きくなります。また、電子メールや討論記録のような未処理のデータにはスペルミスや略語などのワードが数多く含まれている可能性が高いため、クリーンなデータ(出版されたテキストなど)の方が未処理のデータよりも必要なオーバーヘッドが小さくなります。
テキストのみの索引は、テキストとテーマを組み合せた索引よりも小さくなります。プリフィックス索引およびサブストリング索引では、索引がかなり大きくなります。
10.10.4 データの形式は索引付けにどのように影響しますか。
回答: Microsoft Wordファイルのように形式設定されたドキュメントの場合は、ドキュメントに含まれる実際のテキストに比べてサイズが大きくなる傾向があるため、記憶域オーバーヘッドはかなり低くなります。したがって、1GBのWordドキュメントに必要な索引領域が50MBのみであるのに対し、1GBのプレーン・テキストに必要な索引領域は500MBになることがあります。
索引付けに要する時間については、これほど単純ではありません。索引付け対象のテキスト量が減れば明らかな影響は出ますが、索引付けに要する時間を見積るためには、AUTO_FILTER
フィルタまたはその他のユーザー定義フィルタを使用してドキュメントをフィルタ処理する時間を相殺することが必要になります。
10.10.5 パラレル索引付けにより、パフォーマンスは向上しますか。
回答: データが大量にあり、CPUも複数ある場合は、パラレル索引付けにより、索引付けのパフォーマンスが向上します。
リソースに応じて最大3つの索引付けプロセスで索引を作成するには、PARALLEL
キーワードを使用します。
CREATE INDEX index_name ON table_name (column_name) INDEXTYPE IS ctxsys.context PARAMETERS ('...') PARALLEL 3;
また、パラレル索引付けを使用して、パーティション表のローカル・パーティション索引を作成することもできます。ただし、CPUが複数あるときのみ、索引付けのパフォーマンスは向上します。
ノート:
ローカル・パーティション索引を作成するのにPARALLEL
を使用すると、パラレル問合せが有効になります。(非パーティション索引をパラレルに作成しても、問合せはパラレルに処理されません。)
パラレル問合せは、特に負荷の大きいシステムに対して実行すると、問合せのスループットが低下します。このため、パラレル索引作成後はパラレル問合せを使用禁止にすることをお薦めします。この場合は、ALTER INDEX NOPARALLEL.
を使用します
10.10.6 ローカル・パーティション索引を作成する場合、索引のパフォーマンスを改善するにはどうすればよいですか。
回答: CPUが複数あるときは、ローカル索引をパラレルで作成することで索引付けのパフォーマンスを改善できます。
ローカル・パーティション索引をパラレルに作成するには、次の方法があります。
-
CREATE INDEX
文でPARALLEL
句とLOCAL
句を使用します。この場合、最大並列度はパーティション数に制限されます。 -
UNUSABLEの索引を作成してから、
DBMS_PCLXUTIL.BUILD_PART_INDEX
ユーティリティを実行します。この方法により、特にパーティションより多くのCPUを使用している場合に、並列性が高くなります。
2つ目の方法の例を次に示します。元表には3つのパーティションがあります。まず、使用禁止のローカル・パーティション索引を作成してから、DBMS_PCLUTIL.BUILD_PART_INDEX
を実行すると、3つのパーティションがパラレルに作成されます(パーティション間並列性)。各パーティション内の索引は、並列度2でパラレルに作成されます(パーティション内並列性)。
create index tdrbip02bx on tdrbip02b(text) indextype is ctxsys.context local (partition tdrbip02bx1, partition tdrbip02bx2, partition tdrbip02bx3) unusable; exec dbms_pclxutil.build_part_index(3,2,'TDRBIP02B','TDRBIP02BX',TRUE);