为授权保留的内存不完全是“缓冲池的一部分”,这听起来像是缓冲池的一个单独部分。更多的是灰色地带。内存授予由缓冲池支持。被授予 X 内存量的查询在 BP 上进行预留。它不会立即“窃取”BP 的页面。但由于(未被盗的部分)BP 包含数据页,BP 可以兑现保留承诺,因为它可以随时将数据页驱逐到磁盘。随着查询的进展,它可能会从它获得的授权(来自保留)中向 BP 请求页面,并且当 BP 完成请求时,分发给查询的页面变得真正“被盗”,即。在查询释放它们之前,BP 不能再将它们用于数据。为了确保所有授权都能兑现,预留总和不能超过 BP 大小(即没有 VM 样式的过度分配)。这些授权预留往往会在过度分配方面出错,因为如果查询消耗了所有授权并且仍然需要内存,事情可能会变得非常糟糕:发生溢出(非常慢)或者查询可能会放弃并出错。
如果查询没有内存授权,则它不能从这个“工作区”请求内存。您可以在 中查看哪些查询请求内存
sys.dm_exec_query_memory_grants
。正如您已经注意到的,只有某些运算符请求内存授予,即需要大量中间存储的运算符。嵌套循环不需要任何存储,因为它一次操作一行,因此它不会请求内存授予。哈希需要内存来构建哈希表,而排序显然需要排序表。没有授权的查询仍然需要一些内存,但这加起来很小(可能只有几 KB),并且此类内存是从普通的执行分配器中获得的。授予通常以 MB 为单位,可以达到 100 MB。为授权保留的内存不完全是“缓冲池的一部分”,这听起来像是缓冲池的一个单独部分。更多的是灰色地带。内存授予由缓冲池支持。被授予 X 内存量的查询在 BP 上进行预留。它不会立即“窃取”BP 的页面。但由于(未被盗的部分)BP 包含数据页,BP 可以兑现保留承诺,因为它可以随时将数据页驱逐到磁盘。随着查询的进展,它可能会从它获得的授权(来自保留)中向 BP 请求页面,并且当 BP 完成请求时,分发给查询的页面变得真正“被盗”,即。在查询释放它们之前,BP 不能再将它们用于数据。为了确保所有授权都能兑现,预留总和不能超过 BP 大小(即没有 VM 样式的过度分配)。这些授权预留往往会在过度分配方面出错,因为如果查询消耗了所有授权并且仍然需要内存,事情可能会变得非常糟糕:发生溢出(非常慢)或者查询可能会放弃并出错。
请参见了解 SQL 服务器内存授予
Archive.org 链接