为连接表授予大内存

Joh*_*man 5 sql-server t-sql memory-grant

当我从两个连接表中选择列时,会获得巨大的内存授予(529808)。如果我单独查询每个表列,它的组合内存授予仅为 8008。

为什么组合的列列表有如此大的内存授予?或者我可以采取哪些步骤来找出答案?

SELECT *内存授予量为 529808: 在此输入图像描述


仅查询第一个表中的列的内存授予量为 6152: 在此输入图像描述


仅查询另一个表中的列的内存授予量为 1856 在此输入图像描述

Eri*_*ing 8

记忆山羊

您的第一个具有合并联接的查询计划中有一个排序来支持该操作。合并联接需要有序数据,并且只有来自内表的索引有序数据。

外部表的索引在索引键的有用位置没有连接键,因此需要排序。

当您 时,您将按存在的任何排序元素SELECT *进行排序。*这是数据操作的大小,您需要授予临时空间来容纳内存。

在另一个合并联接查询中,您的排序操作将仅在联接列上进行,这将需要比*第一个示例中少得多的内存空间。

请随意将鼠标悬停在排序运算符上以验证输出并按列排序。

哈希连接查询没有排序,但哈希连接将需要一些内存(只是更少,因为哈希通常不是排序方式的数据大小)来构建哈希表。

尽管没有提及,但值得注意的是并行性不会导致内存授予增加 DOP