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,这两者在功能上是否相同?
答案 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()`