如何同步和优化Oracle文本索引?

如何同步和优化Oracle文本索引?,oracle,full-text-search,oracle-text,Oracle,Full Text Search,Oracle Text,我们希望使用ctxsys.context索引类型进行全文搜索。但我很惊讶,这种类型的索引不会自动更新。我们有300万份文档,每天更新/插入/删除约1万次 您对同步和优化Oracle文本索引有何建议?您所说的“不自动更新”是什么意思 索引可以在提交时同步,也可以定期同步 Create index ... on ... INDEXTYPE IS CTXSYS.CONTEXT PARAMETERS ('SYNC ( ON COMMIT)') Create index ... on ... INDEXT

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

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

您所说的“不自动更新”是什么意思

索引可以在提交时同步,也可以定期同步

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 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_作业计划其运行:

DBMS_JOB.SUBMIT(job_id, 'sync_ctx_indexes;', SYSDATE, 'SYSDATE + 1/720');
对于索引优化,可以使用以下命令(也可以使用DBMS_作业或通过cron进行调度):


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

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

您有什么迹象表明索引不同步?这类工具通常不对您的特定需求进行假设。在大量非结构化数据上创建和维护索引通常需要一些考虑,以便您的设计选择产生一个具有可接受权衡的解决方案。搜索引擎的更新和维护策略可能与支持分析的协作创作解决方案大不相同。Oracle确实为您提供了一小部分可供选择的同步选项,而且每天只有10k的DML,您很可能不受任何影响。“提交时”似乎不被推荐。是否也可以在创建索引时指定定期索引优化?请记住:如果您对多列数据存储使用同步(提交时),则只有在包含实际索引的列受到影响时才会触发索引同步。例如,如果在a、B和C列上有一个多列索引,而索引位于a上,则B列的更新不会触发索引同步。对于11g及以上版本,Oracle不建议使用alter index重建文本索引,而是使用ctxsys.ctx_ddl.optimize_index
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)')