我试图弄清楚如何使用 11g R2 上的 Oracle Text Name Search Facility 获得合理的性能。
为了测试,我创建了一个带有 objectid 和全名的表,从现有的表中填充了大约。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 文档建议的各种查询提示,即:
- FIRST_ROWS(50)
- DOMAIN_INDEX_SORT
- 并联(8)
但它似乎并没有太大的区别(虽然真的很难衡量,因为第二次执行相同的查询执行得更快)。