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