优化嵌套的select sql查询

时间:2014-04-15 12:36:57

标签: sql oracle nested query-performance

我想知道这个查询的最佳性能实现是什么:

select subscriber 
from DEGREE
where sub_type is null 
 and (subscriber like '91_9%' 
      or SUBSCRIBER like '919%' 
      or (SUBSCRIBER not in (select msisdn from MCI))) 

FYI MCI表有大约50米记录,msisdn上有定义索引,DEGREE表上有订阅者索引。

最好的问候。

2 个答案:

答案 0 :(得分:3)

我建议像这样编写查询:

select d.subscriber 
from DEGREE d
where d.sub_type is null and
      (d.subscriber like '91_9%' or
       d.subscriber like '919%' or
       not exists (select 1 from MCI where MCI.msisdn = d.subscriber)
      );

然后在degree(sub_type, subscriber)MCI(msisdn)上创建索引。

编辑:

degree上的索引应该会导致以下情况发生。查询将在DEGREE上进行全表扫描,而不是对索引执行索引扫描。我不确定Oracle是否足够聪明,可以使用由like连接的or条件的索引,但至少这是查询的覆盖索引。

MCI上的索引应该会导致简单的索引查找。

因此,使用这两个索引,只需要索引操作来满足查询。这应该会对绩效产生重大影响。

答案 1 :(得分:2)

select subscriber 
from DEGREE left outer join MCI on DEGREE.SUBSCRIBER=MCI.msisdn 
where sub_type is null 
 and (subscriber like '91_9%' 
      or SUBSCRIBER like '919%' 
      or MCI.msisdn is null)