我在论坛上经常看到关于exsis与in效率的问题,大多数都说exsis比in效率高,昨天我把我的一个SQL2K的一个视图改了,原来用in的,现改为用exsis,同样的结果,数据只有4235行,用in不用1秒,用exsis耗时23秒.大侠们请分析分析:
用IN(耗时0.01秒):SELECT *
FROM dbo.判定结果
WHERE ((工程编号 + 项目编号) IN
(SELECT b.工程编号 + b.项目编号
FROM 判定结果 AS b
GROUP BY b.工程编号, b.项目编号
HAVING SUM(b.检测项数) > 0))用EXSIS(耗时23秒):SELECT *
FROM dbo.判定结果 a
WHERE EXISTS
(SELECT 1
FROM dbo.判定结果 AS b WHERE a.工程编号 + a.项目编号 = b.工程编号 + b.项目编号
GROUP BY b.工程编号, b.项目编号
HAVING SUM(b.检测项数) > 0
)
用IN(耗时0.01秒):SELECT *
FROM dbo.判定结果
WHERE ((工程编号 + 项目编号) IN
(SELECT b.工程编号 + b.项目编号
FROM 判定结果 AS b
GROUP BY b.工程编号, b.项目编号
HAVING SUM(b.检测项数) > 0))用EXSIS(耗时23秒):SELECT *
FROM dbo.判定结果 a
WHERE EXISTS
(SELECT 1
FROM dbo.判定结果 AS b WHERE a.工程编号 + a.项目编号 = b.工程编号 + b.项目编号
GROUP BY b.工程编号, b.项目编号
HAVING SUM(b.检测项数) > 0
)
解决方案 »
- sqlserver中 存储过程中convert(varchar(25),@rowspage)是什么意思
- 一个菜鸟问题
- 测试连接数据库的问题
- 请教一个关于事务的问题
- 表的合并查询问题表的合并查询问题
- 更新字段.
- 求一单表SQL统计语句,高手请进。急。。。
- 为什么在企业管理器中改了一个字段的前后位置,发现这个表的大小小了一半。[15--->5]
- 请叫邹大哥及各位前辈(系统掉电导致SQL2005数据库基于一致性的逻辑 I/O 错误)
- 本人本科,96年毕业,熟悉 vc++,vb,asp,sqlserver,有项目经历,初来上海,急于求职,可接受无薪工作!!!请版主暂不要删,人才热线那实在
- 在配置发布、分发服务器时出错!
- 关键字查找问题.
SELECT .....
这样用的多些,个人感觉应该是EXISTS快,因为EXISTS是一搜索到有指定的条件,就马上执行下一个语句,而IN则要全部检索完才执行下一个语句.
"检测项数"不会是负数吧.所以这么改改试试.SELECT *
FROM dbo.判定结果 a
WHERE EXISTS
(SELECT 1
FROM dbo.判定结果 AS b
WHERE a.工程编号= b.工程编号
AND a.项目编号=b.项目编号
AND b.检测项数>0
)同时"工程编号" "项目编号"有没有索引?
a.工程编号 + a.项目编号 = b.工程编号 + b.项目编号 索引使用率就低了.
某些人对in的效率问题的认识进入了误区.SELECT * FROM t1 WHERE ID NOT IN(SELECT ID FROM t2)SELECT * FROM t1 a WHERE NOT EXISTS(SELECT 1 FROM t2 WHERE id = a.ID)SELECT * FROM t1 a WHERE ID NOT IN (SELECT b.ID FROM t2 b WHERE a.f1=b.f1)这三个语句,前面两个功能一样,但效率,你只有测试过才知道。
第三个语句,功能跟前面两个不一样,我举它出来只是作比较用的.第一条语句 子查询 与外部表没有任何连接条件,那么SQL执行时,会将子查询的结果绶存起来, 也即子查询只执行一次. 当子查询语句比较复杂时,这非常有效.
而第二、三种,查询时每对 t1 检索一条记录时都要执行一次子查询。随口说in(或者使用子查询)效率低是不合理的。