当前位置: 首页 > 图文教程 > 数据库 > MSSQL > sql语句优化之用EXISTS替代IN、用NOT EXISTS替代NOT IN的语句

MSSQL
SQL Server口令 sql server安全性
解决SQL Server虚拟内存不足情况
sql中varchar和nvarchar的区别与使用方法
将count(*)值写入另一个表中的方法
SuperSocket 信息: (SpnRegister) : Error 1355。解决方法
sqlserver 复制表 复制数据库存储过程的方法
关于Select Where In 的排序问题
精妙的SQL和SQL SERVER 与ACCESS、EXCEL的数据导入导出转换
在查询结果中添加一列表示记录的行数的sql语句
一条语句简单解决“每个Y的最新X”的经典sql语句
LINQ to SQL:处理char(1)字段的方式会引起全表扫描问题
SQL2000中改名和删除默认sa帐号的最安全方法
mssql SA帐号的改名和删除
SQLServer中master数据库分析
一道sql面试题附答案
三种实现方法实现数据表中遍历寻找子节点
经典SQL语句大全
实例学习mssql存储过程分析
SQL Server中选出指定范围行的SQL语句代码
[图文]三分钟学会Sql Server的复制功能

MSSQL 中的 sql语句优化之用EXISTS替代IN、用NOT EXISTS替代NOT IN的语句


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-09-13   浏览: 116 ::
收藏到网摘: n/a

在许多基于基础表的查询中,为了满足一个条件,往往需要对另一个表进行联接。在这种情况下, 使用EXISTS(或NOT EXISTS)通常将提高查询的效率。在子查询中,NOT IN子句将执行一个内部的排序和合并。无论在哪种情况下,NOT IN都是最低效的 (因为它对子查询中的表执行了一个全表遍历)。为了避免使用NOT IN ,我们可以把它改写成外连接(Outer Joins)或NOT EXISTS。

我要查询 Sendorder表中的冗余数据(没有和reg_person或worksite相连的数据)
sql="select Sendorder.id,Sendorder.reads,Sendorder.addtime from Sendorder where Sendorder.person_id not in(select user_id from reg_person ) or Sendorder.worksite_id not in(select id from worksite) order by Sendorder.addtime desc"
程序执行时间:40109.38毫秒
sql="select Sendorder.id,Sendorder.reads,Sendorder.addtime from Sendorder where not EXISTS (SELECT id FROM reg_person where reg_person.user_id=Sendorder.person_id) or not EXISTS (SELECT id FROM worksite where worksite.id=Sendorder.worksite_id) order by Sendorder.addtime desc"
程序执行时间:8531.25毫秒
很明显使用not EXISTS效率高多了