Oracle全文索引之四 维护

###索引的维护

对于CTXSYS.CONTEXT索引,当应用程序对基表进行DML操作后,对基表的索引维护是必须的。索引维护包括索引同步和索引优化。

在索引建好后,我们可以在该用户下查到Oracle自动产生了以下几个表:(假设索引名为myindex):
DR m y i n d e x myindex myindexI、DR m y i n d e x myindex myindexK、DR m y i n d e x myindex myindexR、DR m y i n d e x myindex myindexN其中以I表最重要,可以查询一下该表,看看有什么内容:
SELECT token_text, token_count FROM dr i r s k 1 i_rsk1 irsk1I WHERE ROWNUM <= 20;
这里就不列出查询接过了。可以看到,该表中保存的其实就是Oracle 分析你的文档后,生成的term记录在这里,包括term出现的位置、次数、hash值等。当文档的内容改变后,可以想见这个I表的内容也应该相应改变,才能保证Oracle在做全文检索时正确检索到内容(因为所谓全文检索,其实核心就是查询这个表)。这就用到sync(同步) 和 optimize(优化)了。

同步(sync):将新的term 保存到I表

优化(optimize): 清除I表的垃圾,主要是将已经被删除的term从I表删除

当基表中的被索引文档发生insert、update、delete操作的时候,基表的改变并不能马上影响到索引上直到同步索引。

####同步和优化方法: 可以使用Oracle提供的ctx_ddl包同步和优化索引

  • 同步:

在对基表插入,修改,删除之后同步索引。推荐使用sync同步索引。语法:

ctx_ddl.sync_index(
idx_name IN VARCHAR2 DEFAULT NULL
memory IN VARCHAR2 DEFAULT NULL,
part_name IN VARCHAR2 DEFAULT NULL
parallel_degree IN NUMBER DEFAULT 1); 
  • idx_name   索引名称
  • memory    指定同步索引需要的内存。默认是系统参数DEFAULT_INDEX_MEMORY 。指定一个大的内存时候可以加快索引效率和查询速度,且索引有较少的碎片
  • part_name 同步哪个分区索引。
  • parallel_degree 并行同步索引。设置并行度。

执行如下语句进行同步:

    exec ctx_ddl.sync_index('yu_test_index')  

实施建议:建议通过oracle的job对索引进行同步

  • 优化:

经常的索引同步将会导致你的CONTEXT索引产生碎片。索引碎片严重的影响了查询的反应速度。你可以定期优化索引来减少碎片,减少索引大小,提高查询效率。
当文本从表中删除的时候,Oracle Text标记删除的文档,但是并不马上修改索引。因此,就的文档信息占据了不必要的空间,导致了查询额外的开销。你必须以FULL模式优化索引,从索引中删除无效的旧的信息。这个过程叫做垃圾处理。当你经常的对表文本数据进行更新,删除操作的时候,垃圾处理是很必要的。

执行如下语句进行优化:

    exec ctx_ddl.optimize_index('yu_test_index','full')  

实施建议:每天在系统空闲的时候对全文索引进行相应的优化,以提高检索的效率

####定时优化索引

SQL> create or replace procedure hsp_sync_index as
  2  begin
  3  ctx_ddl.sync_index('yu_test_index');
  4  end;
  5  /

Procedure created.

Elapsed: 00:00:00.08
SQL> VARIABLE jobno number;  
SQL> BEGIN
   2 DBMS_JOB.SUBMIT(:jobno,'hsp_sync_index();',  
   3 SYSDATE, 'SYSDATE + (1/24/4)');  
   4 commit;  
   5 END;  
   6 /

PL/SQL procedure successfully completed.

Elapsed: 00:00:00.27
SQL> create or replace procedure hsp_optimize_index as
  2  begin
  3  ctx_ddl.optimize_index('yu_test_index','FULL');
  4  end;
  5  /

SQL> VARIABLE jobno number;  
SQL> BEGIN
   2 DBMS_JOB.SUBMIT(:jobno,'hsp_optimize_index();',  
   3 SYSDATE, 'SYSDATE + 1');  
   4 commit; 
   5 END;
   6 /
Procedure created
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值