读书频道 > 网站 > 网页设计 > SQL Server性能调优实战
3.9.2 IN、EXISTS与LEFT JOIN的性能对比
15-11-02    下载编辑
收藏    我要投稿   

本文所属图书 > SQL Server性能调优实战

本书是一线DBA技术专家精心之作,积作者多年的经验结晶和最佳实践,也是目前市场上为数不多通过存储原理来讲解性能优化,剖析SQL Server架构,从而帮助读者快速高效调优数据库的图书。书中首先简要介绍了SQL S立即去当当网订购

作为子查询中的关键字,IN及EXISTS在许多情况下都会被使用到,它们的功能通常可以转化为INNER JOIN。在执行计划中,IN关键字一般会被直接转换成连接操作符,并且依据不同的数据量,选择采用NESTED LOOP或HASH等操作。简单给个示例。查询所有受雇佣人的个人信息,雇佣信息在Employee表中,个人信息在Person表中,通过表中的BusinessEntityId字段关联两个表。为了使语句采用Nested Loop的方式进行inner join关联,选择使用IN/EXISTS子句。如代码清单3-8所示,两种不同的语句编写方法(Query1及Query2),得出的具体执行如图3-7所示,可以看到,它们是一样的。

代码清单3-8 IN、EXISTS示例代码

--Query1
SELECT *
FROM Person.Person AS p WITH(NOLOCK)
WHERE p.BusinessEntityID IN
(
SELECT e.BusinessEntityID
FROM HumanResources.Employee AS e
)

--Query2
SELECT *
FROM Person.Person AS p WITH(NOLOCK)
WHERE EXISTS
(
SELECT 1
FROM HumanResources.Employee AS e
WHERE e.BusinessEntityID=p.BusinessEntityID
)


 

LEFT JOIN主要用于转换“非”操作的数据,例如NOT IN或NOT EXISTS,同样地,查询优化器会对这些NOT进行比较,并转换成LEFT JOIN的方式。以下代码中的几个语句,其执行计划也是相同的,如图3-8所示。

SELECT *
FROM Person.Person AS p
WHERE NOT EXISTS
(SELECT 1
FROM Person.PersonPhone AS pp
WHERE pp.BusinessEntityID=p.BusinessEntityID
)

SELECT *
FROM Person.Person AS p
WHERE p.BusinessEntityID NOT IN
(
SELECT pp.BusinessEntityID
FROM Person.PersonPhone AS pp
)

SELECT *
FROM Person.Person AS p
LEFT JOIN Person.PersonPhone AS pp
ON p.BusinessEntityID = pp.BusinessEntityID
WHERE pp.BusinessEntityID IS NULL


 

点击复制链接 与好友分享!回本站首页
分享到: 更多
您对本文章有什么意见或着疑问吗?请到论坛讨论您的关注和建议是我们前行的参考和动力  
上一篇:1.3 功能
下一篇:1.5 小结
相关文章
图文推荐
JavaScript网页动画设
1.9 响应式
1.8 登陆页式
1.7 主题式
排行
热门
文章
下载
读书

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训
版权所有: 红黑联盟--致力于做最好的IT技术学习网站