SQL Server的三种物理连接之Hash Join(三)

简介

在 SQL Server 2012 在一些特殊的例子下会看到下面的图标:

Hash Join分为两个阶段,分别为生成和探测阶段。

首先是生成阶段,将输入源中的每一个条目经过散列函数的计算都放到不同的Hash Bucket中,其中Hash Function的选择和Hash Bucket的数量都是黑盒,通常来讲,查询优化器都会使用连接两端中比较小的哪个输入集来作为第一阶段的输入源。

接下来是探测阶段,对于另一个输入集合,同样针对每一行进行散列函数,确定其所应在的Hash Bucket,在针对这行和对应Hash Bucket中的每一行进行匹配,如果匹配则返回对应的行。

通过了解哈希匹配的原理不难看出,哈希匹配涉及到散列函数,所以对CPU的消耗会非常高,此外,在Hash Bucket中的行是无序的,所以输出结果也是无序的。

示例演示:

IF OBJECT_ID(‘dbo.Tbl10‘) IS NOT NULL DROP TABLE dbo.Tbl10;
CREATE TABLE dbo.Tbl10(
  Id INT IDENTITY(1,1),
  Val INT,
  Fill CHAR(7000) NOT NULL DEFAULT REPLICATE(‘Fill‘,1750)
);

IF OBJECT_ID(‘dbo.Tbl100‘) IS NOT NULL DROP TABLE dbo.Tbl100;
CREATE TABLE dbo.Tbl100(
  Id INT IDENTITY(1,1),
  Val INT,
  Fill CHAR(7000) NOT NULL DEFAULT REPLICATE(‘Fill‘,1750)
);

INSERT INTO dbo.Tbl10(Val)
SELECT TOP(10) 1+ROW_NUMBER()OVER(ORDER BY (SELECT 1))%100
FROM sys.all_columns A, sys.all_columns B, sys.all_columns C;

INSERT INTO dbo.Tbl100(Val)
SELECT TOP(100) ROW_NUMBER()OVER(ORDER BY (SELECT 1))
FROM sys.all_columns A, sys.all_columns B, sys.all_columns C;

SELECT index_type_desc, alloc_unit_type_desc, index_depth, page_count, record_count
FROM sys.dm_db_index_physical_stats(DB_ID(),OBJECT_ID(‘dbo.Tbl10‘),NULL,NULL,‘SAMPLED‘);

SELECT index_type_desc, alloc_unit_type_desc, index_depth, page_count, record_count
FROM sys.dm_db_index_physical_stats(DB_ID(),OBJECT_ID(‘dbo.Tbl100‘),NULL,NULL,‘SAMPLED‘);

使用hash join执行下面查询

SET STATISTICS IO ON;
GO
SELECT *
FROM dbo.Tbl100 A
INNER HASH JOIN dbo.Tbl10 B
ON A.Val = B.Val;
GO
SET STATISTICS IO OFF;

查看统计信息:

Table ‘Worktable‘. Scan count 0, logical reads 0, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table ‘Tbl10‘. Scan count 1, logical reads 10, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table ‘Tbl100‘. Scan count 1, logical reads 100, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

优缺点:

•所有逻辑连接类型都可以处理。

•它确实需要一个相当大的内存量,足够大,以适应整个左侧输入。(可能会在tempdb中)

•在创建哈希索引的整个过程中,没有一行将返回。

在连接条件中至少有一列需要使用一个相等的比较。

因为昂贵的建立阶段,这是最资源密集的连接算法。然而,一旦哈希表是建立的,这个连接算法可以很快。对于没有可用的索引的大表,在探测阶段的时间节省将超过建设阶段的额外费用。然而,记住,因为大量的内存需求,只有极少数的这些可以运行在同一时间。

时间: 2024-10-10 02:44:35

SQL Server的三种物理连接之Hash Join(三)的相关文章

SQL Server中的三种物理连接操作:嵌套循环连接、合并连接、哈希匹配

浅谈SQL Server中的三种物理连接操作 Merge join.Hash join.Nested loop join对比分析 版权声明:本文为博主原创文章,未经博主允许不得转载.

浅谈SQL Server中的三种物理连接操作

简介 在SQL Server中,我们所常见的表与表之间的Inner Join,Outer Join都会被执行引擎根据所选的列,数据上是否有索引,所选数据的选择性转化为Loop Join,Merge Join,Hash Join这三种物理连接中的一种.理解这三种物理连接是理解在表连接时解决性能问题的基础,下面我来对这三种连接的原理,适用场景进行描述. 嵌套循环连接(Nested Loop Join) 循环嵌套连接是最基本的连接,正如其名所示那样,需要进行循环嵌套,这种连接方式的过程可以简单的用下图

SQL Server 内存中OLTP内部机制概述(三)

----------------------------我是分割线------------------------------- 本文翻译自微软白皮书<SQL Server In-Memory OLTP Internals Overview>:http://technet.microsoft.com/en-us/library/dn720242.aspx 译者水平有限,如有翻译不当之处,欢迎指正. ----------------------------我是分割线---------------

SQL Server的四种隔离级别(转)

转自:https://www.cnblogs.com/cnxcfeng/articles/1162341.html SQL Server的四种隔离级别知识点整理,特别制作了流程图,方便以后查看! SET TRANSACTION ISOLATION LEVEL{ READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE } 一.未提交读READ UNCOMMITTED(脏读)意义:包含未提交数据的读.例如,在多用户环境下,

为何SQL Server登入账号的Password Hash值变动了呢?

Rock日常管理手上的SQL Server会特别注意一点,就是Logins的帐密保存 因为万一哪一天某台SQL Server无预警挂点,所有的帐密该如何快速建立呢? 当然可以利用还原master的方式到新机上,这样就可以一并还原所有帐密. 而第二层保险就是我会每一天搜集所有SQL Server的Logins的Sid及Password Hash值,一但遇到问题也可以透过这些搜集的数据来重建账密. 而这些数据搜集附加价值就是我也可以每一天做数据差异比对,就可以知道哪一 些账号的密码及设定值被异动过,

jdbc至sql server的两种常见方法

Statement和prepareStatement sql server中已建立BookPhone数据库,包含bookPhone表,eclipse中有BookPhone类,三个string类型的值 1. import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLExcepti

重启sql server服务两种方式

1.第一种重启SQl server的方法 点击左侧的数据库重启 如图 右击有个重启操作 2.第二个重启sql server方法

SQL Server 的 6 种隔离级别

背景知识: 高并发一直以来是数据的所追求的目标,然,一般事物是有两面性的.不多说了,等下变邪教了.下面直接看 并发性最高的隔离级别 read uncommitted 1. read uncommitted 级别 比方这时有两个连接A,B:其中A想把表中的值由111改成222,表如下图 就在A改到一半的时B去读数据,结果看到的可能就是 211 这样的数据.这个隔离级别数据库的并发性是提高了,可是事务就不完整了. 它内部是用什么方式来提高并发的呢? 在这个隔离级别时读取数据是不用加锁的,也就是说B没

SQL Server 基本操作之三种增加法

前言: 数据库操作避免不了对数据的操作,操作方法大同小异,万变不离其宗,今就写一下各种花式操作的根本增删改查四种操作,今天我们就来说一下增加操作的三种方法 正文: 增加操作是对数据库进行数据行的添加,用于添加新的数据信息 注意事项: 1.插入数据行时要插入完整,不要只插入几列 2.每个值的数据类型.精度和小数位数必须与相应的列匹配: 3.不能为标识列指定值,因为它的数字是自动增长的: 4.插入时要符合约束 5.具有缺省值的列,可以使用DEFAULT(缺省)关键字来代替插入的数值 格式: (1)