不使用OR子句的查询性能

时间:2010-10-18 12:59:42

标签: performance oracle plsql

我遇到了问题。我有一个查询

Select * from tabA 
where (a) in (a,b,c) 
OR b in (a,b,c) 

由于此查询,我想面对性能问题,因为我需要删除或条件,所以我尝试使用以下查询:

Select * from tabA 
where (a,b) in (a,b,c) 

但是此查询似乎不起作用,请帮忙。我不想使用'或'条件。

3 个答案:

答案 0 :(得分:4)

如果您在逻辑上需要OR条件,那么这就是您所需要的。使用OR没有任何问题。如果两个列都已编制索引,则查询可能不会再独立运行这两个查询:

select * from tabA 
where a in (a,b,c);

select * from tabA 
where b in (a,b,c);

优化器可能会这样做,并将结果连接起来:

Execution Plan
----------------------------------------------------------
   0      SELECT STATEMENT Optimizer=CHOOSE (Cost=4 Card=2 Bytes=256)
   1    0   CONCATENATION
   2    1     TABLE ACCESS (BY INDEX ROWID) OF 'TABA' (Cost=2 Card=1 Bytes=128)
   3    2       INDEX (RANGE SCAN) OF 'TABA_A_IDX' (NON-UNIQUE) (Cost=1 Card=1)
   4    1     TABLE ACCESS (BY INDEX ROWID) OF 'TABA' (Cost=2 Card=1 Bytes=128)
   5    4       INDEX (UNIQUE SCAN) OF 'TABA_B_IDX' (NON-UNIQUE) (Cost=1 Card=1)

答案 1 :(得分:3)

如果逻辑保持不变 - 您可以尝试使用UNION

Select * from tabA  
where (a) in (a,b,c)  
union
Select * from tabA  
where b in (a,b,c)  

另外,检查您的索引并解释计划结果 - 索引可以解决原始OR问题。

答案 2 :(得分:2)

你使用了错误的语法,如果你想要对比较值你应该使用smth:

select * from tabA 
where (a,b) in ((a,b), (a,c), (b,c) etc.

无论如何in条件在查询执行期间转换为多个or条件。

如果您显示表格结构和执行计划,人们将能够更有效地帮助您。