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

参考文章: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') 

NOT IN、NOT EXISTS的相关子查询改用LEFT JOIN--sql2000性能优化_第1张图片

我们用左外连接语句对上面的语句进行替换,先看下面的语句,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 

NOT IN、NOT EXISTS的相关子查询改用LEFT JOIN--sql2000性能优化_第2张图片

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

NOT IN、NOT EXISTS的相关子查询改用LEFT JOIN--sql2000性能优化_第3张图片

 

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

NOT IN、NOT EXISTS的相关子查询改用LEFT JOIN--sql2000性能优化_第4张图片




 

你可能感兴趣的:(数据库操作)