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


看看以下三种写法:

写法1SELECT ... FROM A

WHERE A.key NOT IN (SELECT key FROM B);

 

写法2SELECT ... FROM A

            LEFT JOIN B ON A.key = B.key

WHERE B.key is null;

写法3SELECT ... 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   

猜你喜欢

转载自coollyj.iteye.com/blog/1858860
今日推荐