Oracle Text 小技メモ | アキバ ブログ 進撃の秋葉原

アキバ ブログ 進撃の秋葉原

このブログはアキバな生活を淡々と描くものです。
過度な期待はしないでください。
私、気になります。

全文検索用に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分とかしたほうがいい)