读书人

抉择不存在于另一表的数据几种写法

发布时间: 2013-06-25 23:45:41 作者: rapoo

选择不存在于另一表的数据几种写法

看看以下三种写法:

写法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??????????????????????????? RETURN?????

?

???????????? (?? 1)??????????????????????????? (?? 1)?????

?

?????????????? |???????????????????????????????? |????????

?

????????????? BTQ????????? ?????????????????????BTQ???????

?

???????????? (?? 2)??????????????????????????? (?? 2)?????

?

?????????????? |???????????????????????????????? |????????

?

???????????? FILTER??????????????????????????? HSJOIN?????

?

???????????? (?? 3)??????????????????????? ????(?? 3)?????

?

?????????????? |????????????????????????????? /????? \????

?

???????????? HSJOIN???????????????????? TBSCAN?????? TBSCAN

?

???????????? (?? 4)???????????????????? (?? 4)?????? (?? 5)

?

??????????? /????? \????????????????????? |??????????? |??

?

????? TBSCAN?????? TBSCAN????????? Table:?????????? Table:

?

????? (?? 5)?????? (?? 6)????????? EDS????????????? KF2???

?

??????? |??????????? |???????????? TW_BCUST_200409? TW_BCUST

?

?Table:?????????? Table:?????????

?

?EDS????????????? KF2????????????

?TW_BCUST_200409? TW_BCUST???

读书人网 >其他数据库

热点推荐