ctxsys.context
全文検索にはインデックスタイプを使用したいと思います。しかし、このタイプのインデックスが自動的に更新されないことに非常に驚いていました。1日あたり約1万件の更新/挿入/削除を含む300万件のドキュメントがあります。
OracleTextインデックスの同期と最適化に関する推奨事項は何ですか。
ctxsys.context
全文検索にはインデックスタイプを使用したいと思います。しかし、このタイプのインデックスが自動的に更新されないことに非常に驚いていました。1日あたり約1万件の更新/挿入/削除を含む300万件のドキュメントがあります。
OracleTextインデックスの同期と最適化に関する推奨事項は何ですか。
「自動的に更新されない」とはどういう意味ですか?
インデックスは、コミット時または定期的に同期できます。
Create index ... on ... INDEXTYPE IS CTXSYS.CONTEXT PARAMETERS ('SYNC ( ON COMMIT)')
Create index ... on ... INDEXTYPE IS CTXSYS.CONTEXT PARAMETERS 'SYNC (EVERY "SYSDATE+1/24")')
インデックスを定期的に、たとえば2分ごとに同期するために、DBAが推奨するリアルタイムの検索精度は必要ありません。あなたが一晩それをする余裕があれば、それからさらに良いです。最適なものは、負荷とドキュメントのサイズによって異なります。
これらのリンクは、おそらくより多くの情報を提供することができます:
DBAのアドバイスとしては、serverfaultの方が良いのではないでしょうか。
前の回答で説明したように、「SYNCEVERY」オプションはOracle10g以降でのみ使用可能だと思います。古いバージョンの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_*パッケージもあります。
これをOracle12Cユーザー向けのアップデートとしてここに配置します。インデックスをリアルタイムモードで使用すると、アイテムがメモリに保持され、定期的にメインテーブルにプッシュされます。これにより、断片化が抑えられ、ストリーミングコンテンツでの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モードに設定されます。かなり甘いです。