最近在看牛新庄的《DB2数据库性能调整和优化》,他里面提及到NOT EXISTS与NOT IN的效率比较问题。 网上也看了不少讨论。按照书中结论EXISTS比IN 的效率高。网上也有相关的文章。也有无数网友推荐用EXISTS。但是我测试出来的结果是IN的效率比EXISTS高。
我们先来梳理EXISTS 与 IN的工作原理:
EXISTS是先得到外层表的结果集(例子中CUSTOMER中的结果),用外层表结果集一条一条在内层表中(TXNSALE)查询。
IN 是先生成内层表结果集(TXNSALE),再用外层表结果集到内层表去做比较。
书中的结论:外层结果集大,内层结果集小时,EXISTS效率高。外层结果集大,内层结果集小时,IN的效率高。
测试的结果:都是IN的效率高。
例子:
NOT IN 与 NOT EXISTS 的比较
查找出没有交易的客户和客户姓名,并统计他们的人数
CUSTOMER表中有6000000+条记录--小表
TXNSALE表中有40000000+条记录--大表
第一组比较:
外层表结果集数据小,内层表结果集大。按照书中的结论,外层循环是小结果集,内层循环大结果集,
用EXISTS效率高。结果是采用IN的效率更高,EXISTS耗时18秒,IN耗时15秒。