###索引的维护
对于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