我想知道这个查询的最佳性能实现是什么:
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表上有订阅者索引。
最好的问候。
答案 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)