看看以下三种写法:
写法1:SELECT ... FROM A
?
WHERE A.key NOT IN (SELECT key FROM B);
?
?
?
写法2:SELECT ... FROM A
?
?? ???????? LEFT JOIN B ON A.key = B.key
?
WHERE B.key is null;
?
写法3:SELECT ... FROM A
?
WHERE NOT EXISTS
?
(SELECT 'x' FROM B WHERE A.key = B.key);
?
写法1采用NOT IN的写法。很不幸DB2对于NOT IN通常采用TBSCAN(表扫描),这是效率很差的写法。最佳写法是第三种写法,如果B.key上有索引,它可以不用fetch B表的数据就可以完成查询。第二种写法采用对外表B的 is null判断进行过滤,效率稍差。
?
注:事实上,在DB2优化器的作用下,第二种写法与第三种写法的存取方案相关无几,只是第二种写法比第三种写法多了一步filter操作。
?
建议使用第3种写法,己使用第2种写法的代码也不必修改,因为其效率与第3种写法差不多。
?
例:
?
? SELECT A.*
?
? from EDS.TW_BCUST_200409 A LEFT OUTER JOIN KF2.TW_BCUST B ON
?
????????? A.TM_INTRVL_CD =B.TM_INTRVL_CD and A.CUST_ID =B.CUST_ID and
?
????????? A.USR_ID =B.USR_ID and A.BCUST_EFF_MO =B.BCUST_EFF_MO
?
? WHERE B.TM_INTRVL_CD is null
?
?
?
? SELECT *
?
? from EDS.TW_BCUST_200409 A
?
? where NOT EXISTS
?
???? (select 'x'
?
???? from KF2.TW_BCUST B
?
???? WHERE A.TM_INTRVL_CD =B.TM_INTRVL_CD and A.CUST_ID =B.CUST_ID
?
???????????? and A.USR_ID =B.USR_ID and A.BCUST_EFF_MO =
?
???????????? B.BCUST_EFF_MO)
?
这两种写法对应的存取方案:
?
?????????????????????????????????
?
???????????? RETURN?????????