首页 > 解决方案 > HashMatch 连接是否对 SQL Server 中的两个数据集都使用临时表?

问题描述

我正在 AdventureWorks2014 DB 中执行以下查询。

SET STATISTICS IO ON

SELECT 
    e.JobTitle,
    a.City,
    p.LastName + ', ' + p.FirstName AS EmployeeName
FROM 
    HumanResources.Employee AS e
JOIN 
    Person.BusinessEntityAddress AS bea ON e.BusinessEntityID = bea.BusinessEntityID
JOIN 
    Person.Address a ON bea.AddressID = a.AddressID
JOIN 
    Person.Person AS p ON e.BusinessEntityID = p.BusinessEntityID ;

SET STATISTICS IO OFF

它生成一个执行计划,其中包含嵌套连接输出的哈希匹配(内部连接)(例如输出 1,290 行)和地址表索引扫描的输出(例如输出 2,19614 行)。

当发生哈希匹配(内部连接)时,它是为输出 1 和输出 2 创建临时表(#tables)还是只为输出 1 创建临时表(#tables)?

如果答案只是“输出 1”,那么为什么不为较小的输出创建一个“内存中”的数据结构,而不是创建一个需要文件存储的物理表呢?

标签: sql-server

解决方案


再会,

当发生哈希匹配(内部连接)时,它是为输出 1 和输出 2 创建临时表(#tables)还是只为输出 1 创建临时表(#tables)?

(*简而言之)SQL Server 使用统计信息来选择两个输入中较小的表,并将为该表创建哈希表。这就是为什么我们称这个表为“构建输入”。这是执行计划中最重要的一个。SQL Server 尝试首先在内存中创建表,但如果没有位置,它将使用 TEMPDB 中的物理磁盘空间。

接下来 SQL Server 从较大的表(名为“probe input”)中获取数据,使用哈希匹配函数将其与哈希表进行比较,并返回任何匹配的行。


推荐阅读