我正试图弄清楚如何使用11g R2上的Oracle Text Name Search Facility来获得合理的性能。
为了进行测试,我创建了一个带有objectid和fullname的表,从现有的表中填充大约。 5,400,000行:
create table personname as
select p.objectid, p.fname||chr(32)||p.mname||chr(32)||p.lname as fullname
from person p;
然后我按如下方式设置数据存储区和分区组的首选项:
begin
begin
ctx_ddl.create_preference('namesearch_ds', 'multi_column_datastore');
ctx_ddl.set_attribute('namesearch_ds', 'columns', 'fullname');
end;
begin
ctx_ddl.create_section_group('namesearch_sg', 'basic_section_group');
ctx_ddl.add_ndata_section('namesearch_sg', 'fullname', 'fullname');
end;
end;
最后创建上下文索引:
create index personname_idx
on personname(fullname)
indextype is ctxsys.context
parameters
('datastore namesearch_ds section group namesearch_sg sync(on commit)');
到目前为止,一切都很好。
但是,查询速度很慢。选择这样的选择:
select score(1), pn.*
from personname pn
where contains(pn.fullname, 'ndata(fullname, Bjørn Egil Hansen)', 1) > 0
and rownum <= 50
order by score(1) desc;
可能需要几分钟,响应时间似乎随着查询中的名称数量而增加。
我尝试过使用Oracle doc建议的各种查询提示,即:
但它似乎没有太大的区别(实际上很难衡量,因为第二次执行相同的查询的速度要快得多)。