:
(此处留做读者思考时间)
1-创建驱动表E表上的一个覆盖索引;
2-给not exists 子查询内加个/*+ Hash_AJ */的hint:
优化后的执行计划:
(图4)...如果根据图1的执行计划来进行优化, 那么我会给出下面的优化建议:
1-创建一个函数索引(因为没有具体的数据分布信息,暂用这种极限优化思维),对应的where条件的写法也要配合索引进行改写;
2-再把not...,第3步的全表扫描估值为1, 说明这一步E表的谓词条件过滤性很好,需要一个索引....通过对驱动表E的ID_加to_char函数做主动类型转换, 避免在被驱动表B的EID上做隐式类型转换.
这些对得出优化结论非常重要信息原文没有提及....根据SQL实际执行时间60多秒这个事实, 图1执行计划中,驱动表E过滤后得到的真实结果集应该远大于估算的结果集1, 只有这样,才能对得上平均每次buffer gets 2605万(图2红框)这个数字.