在Oracle中使用null(使用regexp)-非常慢

2admgd59  于 2023-11-17  发布在  Oracle
关注(0)|答案(1)|浏览(182)

试图弄清楚我可以做些什么来加速查询,因为当我试图返回基于NOT为null的值时-它需要永远返回观察结果,我需要杀死作业。
由于IP问题,我屏蔽了一些表名并更改了var名称。此外,我没有测试集,因为它在虚拟集中工作正常,但在真实的生产环境中工作正常-这是它停顿的地方,所以我正在寻找通用概念来解决这个问题。
任何输入/建议赞赏。谢谢。

select prev_pod.mrn_id, prev_pod.pat_enc_id, prev_pod.contact_date, note_text,
coalesce(REGEXP_substr(NOTE_TEXT, '(new)+{1,10}([^.|,|?|$])(wound)+{1,10}([^.|,|?|$])(evaluation)',1,1,'i'), 
REGEXP_substr(NOTE_TEXT, '(foot)+{1,10}([^.|,|?|$])(wound)+{1,10}([^.|,|?|$])(clinic)+{1,10}([^.|,|?|$])(new)',1,1,'i')) as STR

    
from HNO_xxx inner join PREV_POD on HNO_xxx.pat_enc_id=prev_pod.pat_enc_id
                                inner join  HNO_NOTE_TEXT  ON     HNO_xxx.note_id = HNO_NOTE_xxx.note_id and HNO_NOTE_xxx.LINE=1)

select * from ntes where STR IS NOT NULL); --THIS IS THE PROBLEM

字符串

wqsoz72f

wqsoz72f1#

正如所写的那样,Oracle必须读取HNO_NOTE_TEXT的100%,并通过复杂的REGEXP逻辑运行其所有行,以满足 predicate WHERE str IS NOT NULL。为了加快速度,我建议首先使用并行性:

select /*+ parallel(8) */ * from ntes where str is not null

字符串
第二件事是检查执行计划,看看计划是否更改了连接顺序。(来自HNO_NOTE_TEXT)它可能会从HNO_NOTE_TEXT开始,依次连接到HNO_xxxPREV_POD,而如果没有 predicate ,它可能会使用不同的连接顺序。如果这些连接列在一个方向上有索引,而在另一个方向上没有索引,这可以解释运行时的差异。
这里没有明显的限制 predicate ,所以你不想在这里使用索引。检查计划,如果你看到索引正在使用,你可能需要使用/*+ USE_HASH(table_alias) */提示来强制它进行全表扫描+哈希连接。它可能只是因为上面建议的并行提示而决定这样做,但如果没有,编辑你的视图:

select /*+ USE_HASH(hno_xxx prev_pod hno_note_text) PARALLEL(8) */ prev_pod.mrn_id, prev_pod.pat_enc_id, prev_pod.contact_date, note_text,
coalesce(REGEXP_substr(NOTE_TEXT, '(new)+{1,10}([^.|,|?|$])(wound)+{1,10}([^.|,|?|$])(evaluation)',1,1,'i'), 
REGEXP_substr(NOTE_TEXT, '(foot)+{1,10}([^.|,|?|$])(wound)+{1,10}([^.|,|?|$])(clinic)+{1,10}([^.|,|?|$])(new)',1,1,'i')) as STR

    
from HNO_xxx inner join PREV_POD on HNO_xxx.pat_enc_id=prev_pod.pat_enc_id
                                inner join  HNO_NOTE_TEXT  ON     HNO_xxx.note_id = HNO_NOTE_xxx.note_id and HNO_NOTE_xxx.LINE=1)


然后查询它:

select * from ntes where STR IS NOT NULL


但是要注意,如果其他人使用该视图并在其上应用窄 predicate ,这些提示会伤害他们。如果是这种情况,您最好不要使用视图,直接针对表编写SQL,这样您的提示就不会被公开。

相关问题