2017-06-14 53 views
1

我在Oracle数据库中有一个包含数百万条记录的表, 在此表上执行的DML命令主要是INSERT(不带DELETE/UPDATE), 该表正在被特定列上的文本参数查询, 我试图通过添加CTXSYS.CTXCAT索引来调整此查询的性能,并使用如下的catsearch函数, 但实际上,catsearch函数不返回预期结果如下:Oracle catsearch和CTXSYS.CTXCAT索引不能按预期工作

- 首先创建一个包含部门列和随机搜索字符串的emp表

create table emp as 
select rownum id , 'Employee ' || to_char(rownum) name , MOD(rownum,20) + 1 dept , dbms_random.string('A', 50) search_string 
from dual 
connect by level <= 1000000; 

- 然后,创建2个指标 - 一个用于catsearch功能,另一个正指数

begin 
    ctx_ddl.create_index_set('emp_iset'); 
    ctx_ddl.add_index('emp_iset','dept'); /* sub-index A */ 
end; 

CREATE INDEX EMP_FULLTEXT_IDX ON emp(search_string) 
    INDEXTYPE IS CTXSYS.CTXCAT 
    PARAMETERS ('index set emp_iset'); 

create index emp_search_string_idx on emp(search_string); 

现在,我希望,下面的查询将返回相同的结果,但不幸的是,他们不“T:

select count(*) from emp where dept = 10 and lower(search_string) like '%test%'; 

select count(*) from emp where catsearch(search_string, 'test', 'dept = 10') > 0; 

还,查询的2个选项之间的负查询返回了一些成果:

select * from emp where dept = 10 and lower(search_string) like '%test%' 
minus 
select * from emp where catsearch(search_string, 'test', 'dept = 10') > 0; 

我试着查找catsearch函数和CTXSYS.CTXCAT索引的文档,但没有运气, 任何帮助,将不胜感激。

回答

2

您可以使用通配符。

select count(*) from emp where catsearch(search_string, '**test*', 'dept = 10') > 0; 
+0

谢谢,它解决了我的问题! – planben