如何同步和优化Oracle Text索引?

tru*_*nkc 9 oracle full-text-search oracle-text

我们希望使用ctxsys.context索引类型进行全文搜索.但我很惊讶,这种类型的索引不会自动更新.我们有300万份文件,每天更新/插入/删除约10万次.

您对同步和优化Oracle Text索引有何建议?

ewe*_*nli 16

"不自动更新"是什么意思?

索引可以在提交时定期或定期同步.

Create index ... on ... INDEXTYPE IS CTXSYS.CONTEXT PARAMETERS ('SYNC ( ON COMMIT)')
Create index ... on ... INDEXTYPE IS CTXSYS.CONTEXT PARAMETERS 'SYNC (EVERY "SYSDATE+1/24")')
Run Code Online (Sandbox Code Playgroud)

我不需要实时搜索准确性我们的DBA建议定期同步索引,比如每2分钟.如果你能负担得起一夜之间,那就更好了.什么是最好的取决于您的负载和文档的大小.

这些链接可能会为您提供更多信息:

对于DBA的建议,也许服务器故障更好?

  • 请记住:如果您正在使用带有MULTI_COLUMN_DATASTORE的SYNC(ON COMMIT),则只有在包含实际索引的列受到影响时才会触发索引同步.例如,如果列A,B和C上有多列索引,索引位于A上,则B列的UPDATE将不会触发索引同步. (7认同)

max*_*dim 3

我认为“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;
Run Code Online (Sandbox Code Playgroud)

然后通过 DBMS_JOB 安排它运行:

DBMS_JOB.SUBMIT(job_id, 'sync_ctx_indexes;', SYSDATE, 'SYSDATE + 1/720');
Run Code Online (Sandbox Code Playgroud)

对于索引优化,可以使用以下命令(也可以使用DBMS_JOB或通过cron调度):

alter index my_index rebuild online parameters('optimize full maxtime 60');
Run Code Online (Sandbox Code Playgroud)

还有具有类似功能的 CTX_* 包。