全文検索用にOracle Textを利用しているシステムは多い。
数万、数十万、数百万のドキュメントに対してOracle Textを実行したい場合
大量データの処理時間やOracle、PCへの負荷が拡大する。
そんなときに試すべき小技メモ
1)検索用メモリサイズの見直し
Oracle 10g とかだとINDEXをCREATEするときのメモリサイズ
これを大きくすればI/Oが減って処理速度が上がる。
しかし、1G が1つの境界線、1G以上はDEFULTメモリー設定などを変更する必要があり
最大でも2G まで
また、あまり多いと他の処理への影響がある。
マシンの性能や全体のパフォーマンスも考えて設定する。
とりあえず多いほうがいい。
2)SYNC_INDEXするときのパラメータを上記メモリサイズとあわせる。
1回のSYNCするときの処理パラメータ
SYNC_INDEX(INDEX名,FULL,サイズ)
このサイズを上で設定した値にすると断片化が減る。
3)最適化処理にはタイマーをつける
分単位で指定できる。
つけないと最適がで終わらずはまる。
4)SYNC_INDEXを部分的に行う。
FilePointerをUPDATEしてBFILE型で対象ファイルがしてされたときにインデックスがかかる。
対象となるテーブルにたいして、テーブルのカラムが更新されたかを
テーブル内のカラムごとの更新時間を管理したキューで管理され
このキューを参照してOracleテキストが動く。
つまり、対象となるカラム分だけ小分けにしてFilePointerをアップデートし
SYNC_INDEXをすれば1回の処理時間が減る。
数十万件のINDEX作成には数日間かかることもあるので
小分けにしてやるの有効である。
しかし、最初にOracle TEXTにキュー(CTX_なんちゃらテーブル)の時刻情報初期値を覚えさせないといけなので
最初だけFPを全部NULLにしてSYNCさせる必要がある。
1)対象テーブルのFPが全部NULL状態セット
↓
2)CREATE INDEX
↓
3)SYNC_INDEX
↓
4)一部だけFP アップデート
↓
5)SYNC_INDEX
↓
6)4)~5)繰り返し
↓
7)適当なタイミングで最適化(時間制限30分とかしたほうがいい)