具有多个值的ORACLE LIKE

时间:2019-03-18 17:31:49

标签: sql oracle performance query-optimization sql-like

我在ORACLE中有以下查询,由于2个赞之间存在OR,因此运行时间非常长。

select pat_mrn_id,surgery_date, proc_name  
from or_log_all_proc, or_proc, or_log, patient
where 
upper(proc_name) like ('%CRANIOTOMY ANEURYSM%') OR upper(proc_name) like 
('CLIPPING%ANEURYSM')

任何有效编写查询的帮助将不胜感激。 谢谢! JH

4 个答案:

答案 0 :(得分:3)

  

来自or_log_all_proc,or_proc,or_log,患者

您的SELECT包含没有连接条件,因此它将为这三个表中的所有记录生成一个产品,并且无论哪个表的结果集都会被LIKE子句。这是性能问题的根源。

解决方案非常简单。使用适当的键列正确连接表。

附带地,这是使用ANSI 92连接语法的好处。通过明确指定联接的类型,如果我们确实想生成产品,则必须编写CROSS JOIN,并防止我们意外地制造它。

  

期望像LIKE'%anything%'一样快也是徒劳的

直到一点。最有可能是全表扫描,但它是索引列,那么我们可能会得到全速扫描。即使只是FTS,也不一定会造成灾难性的后果,尤其是在桌子很小或摆着桌子时。与大多数调优任务一样,它实际上取决于细节。

答案 1 :(得分:0)

LIKE还是会很慢,不是吗?不过,如果您确定是OR会引起问题,请尝试使用UNION,例如

select pat_mrn_id,surgery_date, proc_name  
from or_log_all_proc, or_proc, or_log, patient
where upper(proc_name) like ('%CRANIOTOMY ANEURYSM%')
union all
select pat_mrn_id,surgery_date, proc_name  
from or_log_all_proc, or_proc, or_log, patient
where upper(proc_name) like ('CLIPPING%ANEURYSM')

此外,我想这不是您真正使用的查询-FROM子句中有4个表,没有任何连接-笛卡尔积不是最佳选择。

答案 2 :(得分:0)

尝试使用union all代替or以获得更好的性能

 select pat_mrn_id,surgery_date, proc_name  
 from or_log_all_proc, or_proc, or_log, patient
 where 
 upper(proc_name) like ('CLIPPING%ANEURYSM')
 union all     
 select pat_mrn_id,surgery_date, proc_name  
 from or_log_all_proc, or_proc, or_log, patient
 where upper(proc_name) like ('%CRANIOTOMY ANEURYSM%')

我还认为您忘记了使用唯一ID连接表

答案 3 :(得分:0)

使用正则表达式代替namespace System { typedef Windows.Foundation.IClosable IDisposable; } namespace MyComponent.MyNamespace { interface IMyInterface : IInspectable requires System.IDisposable { ... } } 。但更重要的是,您缺少LIKE条件:

JOIN

select pat_mrn_id,surgery_date, proc_name from or_log_all_proc join or_proc on ???? join or_log on ???? patient on ???? where regexp_like(upper(proc_name), '(CRANIOTOMY ANEURYSM)|(CLIPPING.*ANEURYSM)'); 相比,性能问题更可能是由于缺乏JOIN条件引起的。