码迷,mamicode.com
首页 > 数据库 > 详细

NOT IN、NOT EXISTS的相关子查询改用LEFT JOIN--sql2000性能优化

时间:2016-07-08 18:09:03      阅读:200      评论:0      收藏:0      [点我收藏+]

标签:

参考文章:SQL SERVER性能优化综述(很好的总结,不要错过哦)

数据库:系统数据库

子查询的用法


         子查询是一个 SELECT 查询,它嵌套在 SELECT、INSERT、UPDATE、DELETE 语句或其它子查询中。任何允许使用表达式的地方都可以使用子查询。子查询可以使我们的编程灵活多样,可以用来实现一些特殊的功能。但是在性能上,往往一个不合适的子查询用法会形成一个性能瓶颈。
          如果子查询的条件中使用了其外层的表的字段,这种子查询就叫作相关子查询。相关子查询可以用IN、NOT IN、EXISTS、NOT EXISTS引入。 关于相关子查询,应该注意:


(1)NOT IN的相关子查询可以改用LEFT JOIN代替写法。比如:

SELECT PUB_NAME FROM PUBLISHERS 
WHERE PUB_ID NOT IN (SELECT PUB_ID 
FROM TITLES 
WHERE TYPE = ‘BUSINESS‘) 

技术分享

我们用左外连接语句对上面的语句进行替换,先看下面的语句,PUBLISHERS 表与TITLES表进行左外连接

SELECT A.PUB_NAME,B.pub_id FROM PUBLISHERS A LEFT JOIN TITLES B 
ON B.TYPE = ‘BUSINESS‘ AND A.PUB_ID=B. PUB_ID 

技术分享

根据要求,我们只要查询出上面pub_id为空的就行,对语句进行如下改进:

技术分享

 

(2)NOT EXISTS的相关子查询可以改用LEFT JOIN代替写法。比如:

技术分享



NOT IN、NOT EXISTS的相关子查询改用LEFT JOIN--sql2000性能优化

标签:

原文地址:http://www.cnblogs.com/firstdream/p/5654009.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!