Oracle Text索引を同期および最適化するにはどうすればよいですか?
-
20-09-2019 - |
質問
使いたいのは、 ctxsys.context
全文検索用のインデックスタイプ。しかし、このタイプのインデックスが自動的に更新されないことに私は非常に驚きました。ドキュメントは 300 万件あり、1 日あたり約 10,000 件の更新/挿入/削除が行われます。
Oracle Text索引の同期と最適化に関する推奨事項は何ですか?
解決
前の回答で説明したように、「SYNC EVERY」オプションはOracle 10g以降でのみ利用可能だと思います。古いバージョンの Oracle を使用している場合は、同期操作を定期的に実行する必要があります。たとえば、次のストアド プロシージャを作成できます。
CREATE OR REPLACE
Procedure sync_ctx_indexes
IS
CURSOR sql1 is select distinct(pnd_index_owner||'.'||pnd_index_name) as index_name from ctx_pending;
BEGIN
FOR rec1 IN sql1 LOOP
ctx_ddl.sync_index(rec1.index_name);
END LOOP;
END;
次に、DBMS_JOB を介して実行をスケジュールします。
DBMS_JOB.SUBMIT(job_id, 'sync_ctx_indexes;', SYSDATE, 'SYSDATE + 1/720');
インデックスの最適化に関しては、次のコマンドを使用できます (DBMS_JOB または cron 経由でスケジュールすることもできます)。
alter index my_index rebuild online parameters('optimize full maxtime 60');
同様の機能を備えた CTX_* パッケージも利用可能です。
他のヒント
「自動更新されない」とはどういう意味ですか?
インデックスはコミット時または定期的に同期できます。
Create index ... on ... INDEXTYPE IS CTXSYS.CONTEXT PARAMETERS ('SYNC ( ON COMMIT)')
Create index ... on ... INDEXTYPE IS CTXSYS.CONTEXT PARAMETERS 'SYNC (EVERY "SYSDATE+1/24")')
リアルタイムの検索精度が必要ない場合、DBA はインデックスを定期的に (たとえば 2 分ごとに) 同期することを推奨しました。一晩かけてやる余裕があれば、さらに良いでしょう。何が最適かは、負荷とドキュメントのサイズによって異なります。
これらのリンクから詳細情報が得られる可能性があります。
DBA のアドバイスとしては、serverfault の方が良いでしょうか?
これを Oracle 12C ユーザー向けの更新としてここに掲載します。リアルタイム モードでインデックスを使用すると、アイテムがメモリ内に保持され、定期的にメイン テーブルにプッシュされるため、断片化が抑えられ、ストリーミング コンテンツでの NRT 検索が可能になります。設定方法は次のとおりです
exec ctx_ddl.drop_preference ( 'your_tablespace' );
exec ctx_ddl.create_preference( 'your_tablespace', 'BASIC_STORAGE' );
exec ctx_ddl.set_attribute ( 'your_tablespace', 'STAGE_ITAB', 'true' );
create index some_text_idx on your_table(text_col) indextype is ctxsys.context PARAMETERS ('storage your_tablespace sync (on commit)')
これにより、NRT モードでインデックスが設定されます。かなり甘いです。