我们想用一个 ctxsys.context 全文搜索的索引类型。但令我感到非常惊讶的是,这种类型的索引不会自动更新。我们有 300 万份文档,每天约有 1 万次更新/插入/删除。

您对同步和优化 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 的建议,也许服务器故障更好?

把此这里用作Oracle 12C的用户的更新。 如果使用实时模式的索引,那么它使项目在内存中,periodicially推到主表,这使碎裂下来,能够在流媒体内容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模式下的索引。这是非常甜蜜的。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top