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

MSSQL
拷贝的SQL Server 7数据库的恢复方法
SQL Server全文检索简介
SQL Server 7.0 一般问题
数据库的查、增、删、改
SQL Server 2000的数据转换服务(下)
SQL Server 2000的数据转换服务(中)
SQL Server 2000的数据转换服务(上)
在SQL2k降序索引上使用中bug
在SQLServer中怎么样恢复数据的存储?
如何将图片存到数据库中?
win98+PWS环境下连接读取远程SQLServer
用SQLServer2000索引视图提高性能(上)
用SQLServer2000索引视图提高性能(下)
如何利用数据库储存图档
袖珍数据库连接查询手册
sql2k增加的Function的sqlbook的帮助
SQL Server静态页面导出技术3
SQL Server静态页面导出技术4
最简便的备份MySql数据库方法
将Access数据库移植到SQL Server 7.0

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


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-09-13   浏览: 136 ::
收藏到网摘: 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效率高多了