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