待优化SQL:
SQL执行计划:
(图1)
SQL历史执行情况:
(图2)
作者将SQL的select 部分拿出来测试执行,执行时间0.55秒:
(图3)
根据上面信息, 专家给出了优化方法...:
(此处留做读者思考时间)
1-创建驱动表E表上的一个覆盖索引;
2-给not exists 子查询内加个/*+ Hash_AJ */的hint:
优化后的执行计划:
(图4)...同时cost对应的891告诉我们, 这个E表不算大,最多也就几十万记录,几十M大小, 同时B表也不大,应该只有几万条记录....但是再仔细想一想,事实应该并非如此....根据SQL实际执行时间60多秒这个事实, 图1执行计划中,驱动表E过滤后得到的真实结果集应该远大于估算的结果集1, 只有这样,才能对得上平均每次buffer gets 2605万(图2红框)这个数字.