问题:在 CLOB 列中执行不区分大小写的搜索的最高效方法是什么?
我简化了查询以轻松重现问题。filedata 表可以有数百万行。许多行可以具有相同的文件 ID。fileid 列已编入索引。在特定文件 ID 匹配多行的情况下,过程非常慢。
select * from filedata where fileid=2148102100 AND REGEXP_LIKE (dataClobfield, 'Some Text Here', 'i');
Run Code Online (Sandbox Code Playgroud)
此查询在 130 秒内完成。此查询返回 16 行,但有 400k 行与 fileid 值匹配(换句话说,如果我删除了 regexp_like where 子句,我将得到 400k,fileid 为 2148102100)。
如果我将其更改为
select * from filedata where fileid=2148102100 AND dataClobfield like '%Some Text Here%';
Run Code Online (Sandbox Code Playgroud)
它在 32 秒内完成,但搜索区分大小写,不符合要求。
我也试过
select * from filedata where fileid=2148102100 AND LOWER(dataClobfield) like '%some text here%';
Run Code Online (Sandbox Code Playgroud)
这在 83 秒内返回......比 regexp_like 好,但仍然不是很好。
我读过的其他内容没有奏效:使用 DBMS_LOB.instr 函数(区分大小写)设置会话 NLS_SORT=BINARY_CI(不适用于 CLOB)。理想情况下,我希望将其缩短到 30 秒。有任何想法吗?
Ada*_*ium -3
or
使用来匹配小写和大写怎么样?
select *
from filedata
where fileid = 2148102100 and
(dataClobfield like '%some text here%' or dataClobfield like '%SOME TEXT HERE%');
Run Code Online (Sandbox Code Playgroud)
我可能会比 83 秒的情况表现得更好,因为它避免了对列值的操作。
归档时间: |
|
查看次数: |
1815 次 |
最近记录: |