一、嵌套循环
--------------------嵌套循环-------------------- /* 循环嵌套连接的图标同样十分形象,处在上面的外部输入(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
时间: 2024-10-10 10:21:35