在数据查询中慎用 NOT IN

今天听到一同事反应,有个程序页面查询速度过慢,打开一看,竟是我自己两年前刚进公司写的。
 

二年前V1.0 代码如下:
SELECT *
        FROM VBookBW_FaGao
  WHERE FYWFlag = 1
             And FCancelFlag = 0
             And FBookId>0
             And FBookId NOT IN(
                         SELECT  DISTINCT ISNULL(FBookId,0) FBookId
                                 FROM TSendPressMaster
                               )
 
查询结果
00:00:39   8348 行

 
修改后V2.0 代码如下:
WITH TA AS (
 SELECT * FROM VBookBW_FaGao
 WHERE FYWFlag = 1
          AND FCancelFlag = 0
          AND FBookId>0
),
TB AS(
  SELECT  DISTINCT ISNULL(FBookId,0) FBookId
                FROM TSendPressMaster
    )

SELECT TA.* FROM TA
LEFT JOIN TB  ON TA.FBookId =  TB.FBookId
WHERE TB.FBookId IS NULL


查询结果
00:00:01 8348

 

 

在V2.0版本代码中,查询的数度明显得到了优化,从39秒提升到1秒。

 

 在V1.0版本代码中有几个很明显的错误:

       1、查询条件的排列位置:把查询条件顺序反过来写,8000多行代码执行数度也会提示至少5秒。

           (SQL 在执行查询条件时,查询的先后顺序是按从外到里) ;

       2、NOT IN 使用不当:

 

在V2.0版本中,用到了SQL2005 新特性 【WITH】

      1、在两个表中,首先把两个表中的数据进行条件筛选;

      2、在筛选结果中,根据两个表中的关系通过 IS NULL 取代 NOT IN

 

 

 

工作快三年了,CSDN也注册了很久,一直忙于工作学习,对外面的技术了解甚少,借助于这个平台,记录自己工作的点滴。

 

 

唐根亮 晖力计算机 2011-05-25 TGL2008@VIP.QQ.COM

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值