关于Oracle查询功能行为

时间:2016-11-23 15:45:43

标签: oracle

CREATE TABLE ak_temp
(
  misc_1 varchar2(4000),
  misc_2 varchar2(4000),
  time_of_insert timestamp  
);

查询1(原件):

select * 
  from ak_temp 
 where misc_1 in('ankush') 
    or misc_2 in('ankush')

查询2:

select * 
  from ak_temp 
 where 'ankush' in (misc_1,misc_2)

嗨,我的查询有点类似的问题,我想避免查询1,因为我们的实时环境中的成本有点偏高,所以我已经找出了成本更低的查询2,这两者在功能上是否相同?

1 个答案:

答案 0 :(得分:3)

这两者在功能上是等价的,应该产生相同的查询计划,因此不应该具有相对于另一个的性能优势(或者任何这样的优势将是微不足道的)。 Oracle可能足够聪明,可以利用两个索引,一个在ak_temp(misc_1)上,另一个在ak_temp(misc_2)上。

但是,您也可以考虑:

select t.* 
from ak_temp t
where misc_1 = 'ankush'
union
select t.*
from ak_temp t
where misc_2 = 'ankush';

这个版本肯定会利用索引,但如果许多行符合这两个条件,union可能会减慢速度。

编辑:

要避免使用union,您可以执行以下操作:

select t.* 
from ak_temp t
where misc_1 = 'ankush'
union all
select t.*
from ak_temp t
where misc_2 = 'ankush' and (misc_1 <> 'ankush' and misc_1 is not null);  -- or use `lnnvl()`