我在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
答案 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
条件引起的。