oracle sql 用什么可以替代or,这样查询特别慢

((c.createdby = 'liuqi' ) or
(c.state = 'submit' and
(c.verfiedby = 'liuqi' )) or
c.state in
('verfied','pass'))

(1) 用UNION替换OR (适用于索引列)
通常情况下, 用UNION替换WHERE子句中的OR将会起到较好的效果. 对_______索引列使用OR将造成全表扫描. 注重, 以上规则只针对多个索引列有效. 假如有column
没有被索引, 查询效率可能会因为你没有选择OR而降低. 在下面的例子中, LOC_ID 和REGION上都建有索引.
高效:
SELECT LOC_ID , LOC_DESC, REGION FROM LOCATION WHERE LOC_ID = 10 UNION SELECT LOC_ID , LOC_DESC ,REGION FROM LOCATION WHERE REGION = “MELBOURNE”
低效:
SELECT LOC_ID , LOC_DESC, REGION FROM LOCATION WHERE LOC_ID = 10 OR REGION = “MELBOURNE”
假如你坚持要用OR, 那就需要返回记录最少的索引列写在最前面.
(2) 用IN来替换OR
这是一条简单易记的规则,但是实际的执行效果还须检验,在ORACLE8i下,两者的执行路径似乎是相同的. 
低效: SELECT…. FROM LOCATION WHERE LOC_ID = 10 OR LOC_ID = 20OR LOC_ID = 30 高效 SELECT… FROM LOCATION WHERE LOC_IN IN (10,20,30);
温馨提示:答案为网友推荐,仅供参考
第1个回答  推荐于2017-10-27
分别查询,通过union all合并多有结果集,类似:
select * from (
select * from XXX c where c.createdby = 'liuqi' and state in
('verfied','pass')

union all
select * from XXX c where c.state = 'submit' and c.verfiedby = 'liuqi' and state in
('verfied','pass')
)本回答被提问者和网友采纳
第2个回答  2013-10-24
可以使用 case when xxx then yyy else zzz end
这个比较快速
第3个回答  2013-10-17
分别写几个查询语句,然后用union all把几个查询联起来。
相似回答