sql-server - 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”,那么为什么不为较小的输出创建一个“内存中”的数据结构,而不是创建一个需要文件存储的物理表呢?
解决方案
再会,
当发生哈希匹配(内部连接)时,它是为输出 1 和输出 2 创建临时表(#tables)还是只为输出 1 创建临时表(#tables)?
(*简而言之)SQL Server 使用统计信息来选择两个输入中较小的表,并将为该表创建哈希表。这就是为什么我们称这个表为“构建输入”。这是执行计划中最重要的一个。SQL Server 尝试首先在内存中创建表,但如果没有位置,它将使用 TEMPDB 中的物理磁盘空间。
接下来 SQL Server 从较大的表(名为“probe input”)中获取数据,使用哈希匹配函数将其与哈希表进行比较,并返回任何匹配的行。
推荐阅读
- node.js - 我应该在 NPM package.json 中将我的“启动”脚本设置为什么?
- sas - 在 SAS 中创建原始数据文件
- php - 雄辩的关系方法不存在
- macos - 为什么我的 SDL_ttf 字体如此像素化和丑陋?有更好的字体渲染方法吗?
- python - 将迭代器传递给 dask.delayed 函数
- python - tkinter 中的 textvariable 参数在初始运行后未更新
- nuxt.js - 为什么配置上的 nuxt.js 全局 css 不起作用?
- python - Python 3 中的高效字符串连接
- android - 如何在 android recyclerview ltem 中添加自定义关闭按钮?
- php - 如何使用递归对多维数组中的特定值求和?