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

学习如何看懂SQL Server执行计划(三)——链表查询篇

时间:2016-08-16 15:58:54      阅读:209      评论:0      收藏:0      [点我收藏+]

标签:

一、嵌套循环
--------------------嵌套循环--------------------
/*
循环嵌套连接的图标同样十分形象,处在上面的外部输入(Outer input),
这里也就是聚集索引扫描。和处在下面的内部输入(Inner Input),
这里也就是聚集索引查找。外部输入仅仅执行一次,根据外部输入满足Join条件的每一行,
对内部输入进行查找。这里由于是7行,对于内部输入执行7次。根据嵌套循环的原理不难看出,
由于外部输入是扫描,内部输入是查找,当两个Join的表外部输入结果集比较小,
而内部输入所查找的表非常大时,查询优化器更倾向于选择循环嵌套方式。
*/
SELECT * FROM dbo.UserInfo AS u
INNER JOIN dbo.Coupon AS c
ON u.Id = c.UserId

技术分享

二、合并连接
--------------------合并连接--------------------
/*
不同于循环嵌套的是,合并连接是从每个表仅仅执行一次访问。从这个原理来看,合并连接要比循环嵌套要快了不少。
从合并连接的原理不难想象,首先合并连接需要双方有序.并且要求Join的条件为等于号。因为两个输入条件已经有序,
所以从每一个输入集合中取一行进行比较,相等的返回,不相等的舍弃,从这里也不难看出Merge join为什么只允许Join后面是等于号。
从图11的图标中我们可以看出这个原理。如果输入数据的双方无序,则查询分析器不会选择合并连接,
我们也可以通过索引提示强制使用合并连接,为了达到这一目的,执行计划必须加上一个排序步骤来实现有序。
这也是上述SQL语句为什么要加OPTION(MERGE join)的原因。上述对Article表的ColumnId列进行了排序。
*/
SELECT * FROM dbo.UserInfo AS u
INNER JOIN dbo.Coupon AS c
ON u.Id = c.UserId
OPTION(MERGE JOIN)

技术分享

三、哈希连接
--------------------哈希连接--------------------
/*
散列连接同样仅仅只需要只访问1次双方的数据。散列连接通过在内存中建立散列表实现。
这比较消耗内存,如果内存不足还会占用tempdb。但并不像合并连接那样需要双方有序。
删除掉UserInfo的主键及其中的聚集索引,在执行以下SQL

要删除掉聚集索引,否则两个有序输入SQL Server会选择代价更低的合并连接。
SQL Server利用两个上面的输入生成哈希表,下面的输入来探测,可以在属性窗口看到这些信息,
通常来说,所求数据在其中一方或双方没有排序的条件达成时,会选用哈希匹配。
*/
ALTER TABLE dbo.UserInfo DROP CONSTRAINT PK_UserInfo_Id --删除主键
--DROP INDEX Index_UserInfo_Name --删除聚集索引
--ALTER TABLE dbo.UserInfo ADD CONSTRAINT PK_UserInfo_Id PRIMARY KEY CLUSTERED(Id) --创建主键

SELECT * FROM dbo.UserInfo AS u
INNER JOIN dbo.Coupon AS c
ON u.Id = c.UserId

技术分享

四、多表并行
--------------------多表并行--------------------
/*
当多个表连接时,SQL Server还允许在多CPU或多核的情况下允许查询并行,这样无疑提高了效率。
*/
SELECT * FROM dbo.UserInfo AS u
INNER JOIN dbo.Coupon AS c
ON u.Id = c.UserId
INNER JOIN dbo.OneWayAirPolicy_20w AS o
ON u.Id = o.PId

技术分享

学习如何看懂SQL Server执行计划(三)——链表查询篇

标签:

原文地址:http://www.cnblogs.com/taiyonghai/p/5776569.html

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