Oracle Exists与Not Exists 效率问题

oracle NOT exists 效率差

从执行过程来看,LEFT JOIN方式的主要消耗在Sending data一项上,而NOT EXISTS方式主要消耗在executeing和Sending data两项上,受限于Profiling只存放100行记录缘故,从Profiling只能看到47个executeing和Sending data的组合项(每个组合项约50us),通过执行计划看出,外表t_monitor的数据量为578436行,忽略统计信息不准情况下,使用NOT EXISTS方式应该会产生578436个executeing和Sending data的组合项,总计消耗时间=50us*578436=28921800us=28.92s

从上面的执行过程可以推断出:
使用NOT EXISTS方式的执行性能严重依赖于NOT EXISTS 子查询的执行次数即外层查询结果集的数据量。
1、当外层查询结果集的数据量N较小时执行性能较好,如有N=10执行时间为50us*10=500us=0.005s,再加上一些额外消耗,执行结果也能在0.01秒或10毫秒内范围,这个响应时间应该能被大部分应用程序接受。
2、当外层程序结果集的数据量N较大甚至上千万数据量时,NOT EXISTS的查询性能会变得非常糟糕,甚至会大量消耗服务器IO和CPU资源从而影响其他业务正常运行。

你可能感兴趣的:(数据库,oracle)