第一次实施Oracle Text项目,经验与教训记录

前面对Oracle Text做了一段时间的学习和研究应用
但是都关注于如果使用以与我们的系统集成

这2周去客户那实施,
由于2台Oracle服务器虽然版本相同,但某些配置或环境的原因(最后也没找到那些区别)
之间遇到的N多问题把我郁闷坏了
google不到,其间还通知ITPub重启了一次服务器。。

在此做一下总结吧,免得又忘了

1. 关于不同服务器,2个模糊搜索or的解决办法
数据表T1有2个字段f1,f2均建有全文索引
搜索语法应该是
Select Count(id) from t1 where contains(idx_f1,'about(中国)')>0 or  contains(idx_f2,'about(中国)')>0

 在一台服务器是正常的(搜索耗时不到1s),另一台有问题如下(搜索耗时1min+):

SQL> SELECT count(t1.sFileID) FROM bms115.tfilecache t1 where ((Contains(t1.sdoc
info,'About(sports arts)', 1) > 0 or Contains(t1.scontext,'About(sports arts)' , 2) > 0));


COUNT(T1.SFILEID)
-----------------
872


Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=55 Card=1 Bytes=107)
1 0 SORT (AGGREGATE)
2 1 TABLE ACCESS (FULL) OF 'TFILECACHE' (Cost=55 Card=135 By
tes=14445)

上面TABLE ACCESS (FULL) OF 'TFILECACHE' 在正常机器为Table Access(By Index RowID)


Statistics
----------------------------------------------------------
1378394 recursive calls
0 db block gets
1386185 consistent gets
2 physical reads
0 redo size
386 bytes sent via SQL*Net to client
503 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
1 rows processed

解决办法为
修改查询语句,采用union分别计算2个字段的情况
SELECT count(t1.sFileID) FROM bms115.tfilecache t1 where ((Contains(t1.sdocinfo,'About(sports arts)', 1) > 0
union
SELECT count(t1.sFileID) FROM bms115.tfilecache t1 where Contains(t1.scontext,'About(sports arts)' , 2) > 0));
这种语句并不是对所有情适用,在我们单位测试机器上,就只能使用Or连接的方式


2.无法启用在线更新的办法
在执行索引更新时
  execute immediate
 ' alter index BMS115.IDX_CONTEXT rebuild online ' ||
 ' parameters ( ''sync'' )' ;
时出现问题 说 未启用特性 Online Index Build
这个据google说是Oracle版本问题
但我们的情况是2台都是企业版,可能安装有差别
解决办法是使用ctx_ddl包的相关办法
ctx_ddl.sync_index('BMS115.IDX_CONTEXT' );
要在存储过程中使用这个包,需要用户授予ctxApp角色,同时添加对该包的访问权限: EnterpriseManager 安全性--〉用户 -->对象页签

或者重建索引
drop index idx_f1;
create index idx_f1 on t1(f1) index type is ....;

对于查询使用Union的情况,
在执行完同步后,要记得要执行一次分析
dbms_stats.gather_index_stats(ownname=> 'BMS115', indname=> 'IDX_CONTEXT', partname=> NULL);
否则速度慢的可怜。。。



原文地址:https://www.cnblogs.com/calmzeal/p/770514.html