我们书写查询语句的时候,Join 参数之前可以是下面三个 { LOOP | MERGE | HASH } JOIN  。 如果不使用,则系统自己分析那种方式快,使用那种方式。
这其实是SQL Server 联结时候使用的三种算法。尽管每种算法都并不是很复杂,但考虑到性能优化,在产品级的优化器实现时往往使用的是改进过的变种算法。譬如SQL Server 支持block nested loops、index nexted loops、sort-merge、hash join以及hash team。我们在这里只对上述三种基本算法的原型做一个简单的介绍。
知识点:
Tables join总是两个两个进行的。所以下面的算法都是两个表的联结。
  • Hash Join (哈希联结)

    • 下图是 SQL Server 标示这种联结的图标,从图标我们就可以看到这个查询的逻辑。
    • 逻辑步骤,如下图:
      • 以数据少的数据表的 Join 字段建立 Hash 值。
      • 对应的数据表计算 Join 字段的 Hash ,再与前一个数据表做比对。
    • 特点:
      • 处理大量、未排序、无索引的数据
      • 一般来说,查询优化器会首先考虑Nested Loop和Sort-Merge,但如果两个集合量都不小且没有合适的索引时,才会考虑使用Hash Join。
      • Hash Join也用于许多集合比较操作,inner join、left/right/full outer join、intersect、difference等等,当然了,需要保证都是等值联结。
      • Hash Join一个较大限制是它只能应用于等值联结(equality join),这主要是由于哈希函数及其桶的确定性及无序性所导致的。
  • Nested Loop Join (嵌套循环联结)

    • 下图是 SQL Server 标示这种联结的图标,从图标我们就可以看到这个查询的逻辑。
    • 逻辑步骤,如下图:
      • 从外层的数据表取出一笔记录
      • 使用这个记录扫描内层的数据表
      • 再回到外层的数据表,重复上述的步骤。
    • 特点:
      • 适用于一个集合大而另一个集合小的情况(将小集合做为外循环),I/O性能不错。
      • 当外循环输入相当小而内循环非常大且有索引建立在JOIN字段上时,I/O性能相当不错。
      • 当两个集合中只有一个在JOIN字段上建立索引时,一定要将该集合作为内循环。
      • 对于一对一的匹配关系(两个具有唯一约束字段的联结),可以在找到匹配元组后跳过该次内循环的剩余部分(类似于编程语言循环语句中的continue)。
      • 可以不是等值联结
  • Merge Join (合并联结)

    • 下图是 SQL Server 标示这种联结的图标,从图标我们就可以看到这个查询的逻辑。
    • 逻辑步骤。如下图:
      • 使用两个数据表用来 Join 的字段既有的索引
      • 两边的数据表以光标由小到大比较,一边移动到比另一个数据表大时,换移另一个数据表。
    • 特点:
      • 可以不是等值联结
      • MERGE JOIN 必须等待两个单独的SORT JOIN完成(如果使用索引作为数据源,可以跳过SORT JOIN这个步骤), 如果两个表的规模相差很大, 会很影响查询的性能。
      • 当查询的两个表都很大或者都很小的时候, 则应该只用MERGE JOIN,如果两个表都很小,则表扫描和分类将进行的很快;
分别使用这三种 Join 的例子:
create table t1 ( i int not null )
create table t2 ( i int not null )
go
set showplan_text on
go
-- Hash Match(Inner Join, HASH:([ghj_Demo].[dbo].[t2].[i])=([ghj_Demo].[dbo].[t1].[i]))
select * from t1 join t2 on t1.i = t2.i
go
set showplan_text off
go
alter table t1 add primary key ( i )
alter table t2 add primary key ( i )
go
set showplan_text on
go
-- |--Nested Loops(Inner Join, OUTER REFERENCES:([ghj_Demo].[dbo].[t1].[i]))
select * from t1 join t2 on t1.i = t2.i
go
set showplan_text off
go
set showplan_text on
go
-- Merge Join(Inner Join, MERGE:([ghj_Demo].[dbo].[t1].[i])=([ghj_Demo].[dbo].[t2].[i]),
-- RESIDUAL:([ghj_Demo].[dbo].[t2].[i]=[ghj_Demo].[dbo].[t1].[i]))
select * from t1 join t2 on t1.i = t2.i option(merge join)
go
set showplan_text off
go
drop table t1, t2
参考资料:
浅谈查询优化器中的JOIN算法
[url]http://blog.csdn.net/hdy007/archive/2007/02/28/1516467.aspx[/url]
 
Example of merge ,hash and nested join
[url]http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=498748&SiteId=1[/url]
 
Inside SQL Server Joins
[url]http://blog.csdn.net/happydreamer/archive/2007/05/16/1611523.aspx[/url]

转载于:https://blog.51cto.com/zhoujiyu/150217

SQL Server 索引基础知识(10)----Join 时的三种算法简介相关推荐

  1. SQL Server 索引基础知识(8)--- 数据基本格式补充(转自蝈蝈俊.net)

    我在SQL Server 索引基础知识系列中,第一篇就讲了记录数据的基本格式.那里主要讲解的是,数据库的最小读存单元:数据页.一个数据页是8K大小. 对于数据库来说,它不会每次有一个数据页变化后,就存 ...

  2. [转]SQL Server 索引基础知识(2)----聚集索引,非聚集索引

    SQL Server 索引基础知识(2)----聚集索引,非聚集索引 [来自]http://blog.joycode.com/ghj/archive/2008/01/02/113291.aspx 由于 ...

  3. SQL Server 索引基础知识(1)--- 记录数据的基本格式

    不论是缓存的数据信息,还是物理保存的信息,他们的基本单位都是数据页.所以理解数据页是最最基础的知识点,本篇博客就介绍跟索引有关的数据页的一些基础知识. 数据页的基础知识 SQL Server 中数据存 ...

  4. SQL Server 索引基础知识 1 --- 记录数据的基本格式

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 由于需要 ...

  5. SQL Server 索引基础知识(7)----Indexing for AND(转自蝈蝈俊.net)

    我们通过一个实例来看 有And 操作符时候的最常见的一种情况.我们有下面一个表, CREATE TABLE [dbo].[member]( [member_no] [dbo].[numeric_id] ...

  6. SQL Server在存储过程中编写事务处理代码的三种方法

    SQL Server中数据库事务处理是相当有用的,鉴于很多SQL初学者编写的事务处理代码存往往存在漏洞,本文我们介绍了三种不同的方法,举例说明了如何在存储过程事务处理中编写正确的代码.希望能够对您有所 ...

  7. SQL Server数据库基础知识汇总

    目录 目录 一.数据库概念 1.1 什么是数据库 1.2 为什么用数据库 1.3 数据库的发展历史 1.4 数据库分类 1.5 DBMS数据库管理系统 二. SQL(Structured Query ...

  8. 数据库开发基本操作-SQL Server数据库基础知识

    数据库是一个信息系统应用程序的重要组成部分,在Web开发中,应用更加广泛,要学习好Web开发和ADO.NET,就必须对数据库有一定的了解. 数据库的概念很广,可以从很多方面进行解释.但是在计算机中,它 ...

  9. SQL - server 数据库基础知识

    SQL:Structured Quety Language SQL SERVER是一个以客户/服务器(c/s)模式访问.使用Transact-SQL语言的关系型数据库管理子系统(RDBMS) DBMS ...

最新文章

  1. 递归下降文法C语言实验报告,递归下降语法分析器实验报告.doc
  2. 国内较强的NLP高校实验室有哪些?
  3. 第一部分:数据中心专业名词你知道多少?
  4. qt udp多线程收发过程_! udp多线程的有关问题
  5. visual studio 2019安装配置可编写c/c++语言的IDE环境
  6. 开源播放器 支持视频广告
  7. 虚虚实实,亦假亦真的 ValueTuple,绝对能眩晕你
  8. js 刷新div_vue.js备忘记录(五) vue-router
  9. Use grep to report back only line numbers
  10. android系统性能优化---(9)Android 绿色应用公约
  11. JAVA Reflection(反射机制)续
  12. Spring-aop-TargetSource/ProxyFactory/DefaultAopProxyFactory
  13. js王者归来之正则表达式
  14. python二维数据读取对齐_[Python ] Python 多维数组转换的维度对齐问题
  15. JDBC数据库编程(java实训报告)
  16. 这么有料的福利,你还不赶紧关注一波吗?(代码合集)
  17. Unity 实现批量Build打包
  18. Oracle OCA、OCP、OCM认证科目及考试内容
  19. 经纬能源安全稳定怎样理财收益最大?怎样理财才干收益最大?
  20. 机器视觉之eVision

热门文章

  1. 英伟达新禁令:不能随便用GeForce显卡跑深度学习(挖矿可以)
  2. digiKam 6.1.0 发布,相片管理工具
  3. npm安装失败,哪位大神帮忙看一下
  4. display:table与本身的table的区别
  5. linux基础学习2
  6. 解读现代存储系统背后的经典算法
  7. VxRack与VxRail遭受Power的“全面入侵”
  8. Springmvc_3(SessionAttributes 将数据放入到session中)
  9. context:component-scan标签的use-default-filters属性的作用以及原理分析
  10. Gentoo下cacti的安装