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

时间:2009-12-16 17:26:26

标签: oracle full-text-search oracle-text

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

您对同步和优化Oracle Text索引的建议是什么?

3 个答案:

答案 0 :(得分: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")')

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

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

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

答案 1 :(得分: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;

然后安排它通过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_ *包具有类似的功能。

答案 2 :(得分:1)

将此作为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模式下设置索引。它很可爱。