我在Oracle数据库中有一个表,其中包含数百万条记录, 在此表上执行的DML命令主要是INSERT(没有DELETE / UPDATE), 正在通过特定列上的文本参数查询此表, 我尝试通过添加CTXSYS.CTXCAT索引来调整此查询的性能,并使用catsearch函数,如下所示, 但实际上catsearch函数并没有返回预期的结果:
- 首先,创建一个带有dept列和随机搜索字符串的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);
现在,我希望以下查询会返回相同的结果,但不幸的是,他们没有:
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索引的文档,但还没有运气, 任何帮助将不胜感激。
答案 0 :(得分:2)
您可以使用通配符。
select count(*) from emp where catsearch(search_string, '**test*', 'dept = 10') > 0;