不使用 OR 子句的查询性能

M.J*_*.J. 1 oracle performance plsql

我面临一个问题。我有一个疑问

Select * from tabA 
where (a) in (a,b,c) 
OR b in (a,b,c) 
Run Code Online (Sandbox Code Playgroud)

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

Select * from tabA 
where (a,b) in (a,b,c) 
Run Code Online (Sandbox Code Playgroud)

但这个查询似乎不起作用,请帮忙。我不想使用“或”条件。

Ton*_*ews 5

如果您逻辑上需要 OR 条件,那么这就是您所需要的。使用 OR 没有任何问题。如果两列都被索引,那么查询所花的时间可能不会超过独立运行这两个查询的时间:

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

select * from tabA 
where b in (a,b,c);
Run Code Online (Sandbox Code Playgroud)

优化器很可能会这样做并将结果连接起来,如下所示:

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)
Run Code Online (Sandbox Code Playgroud)