试图弄清楚我可以做些什么来加速查询,因为当我试图返回基于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
字符串
1条答案
按热度按时间wqsoz72f1#
正如所写的那样,Oracle必须读取
HNO_NOTE_TEXT
的100%,并通过复杂的REGEXP逻辑运行其所有行,以满足 predicateWHERE str IS NOT NULL
。为了加快速度,我建议首先使用并行性:字符串
第二件事是检查执行计划,看看计划是否更改了连接顺序。(来自
HNO_NOTE_TEXT
)它可能会从HNO_NOTE_TEXT
开始,依次连接到HNO_xxx
和PREV_POD
,而如果没有 predicate ,它可能会使用不同的连接顺序。如果这些连接列在一个方向上有索引,而在另一个方向上没有索引,这可以解释运行时的差异。这里没有明显的限制 predicate ,所以你不想在这里使用索引。检查计划,如果你看到索引正在使用,你可能需要使用
/*+ USE_HASH(table_alias) */
提示来强制它进行全表扫描+哈希连接。它可能只是因为上面建议的并行提示而决定这样做,但如果没有,编辑你的视图:型
然后查询它:
型
但是要注意,如果其他人使用该视图并在其上应用窄 predicate ,这些提示会伤害他们。如果是这种情况,您最好不要使用视图,直接针对表编写SQL,这样您的提示就不会被公开。