SQL*_*ner 6 sql-server-2008 sql-server
工作区内存(缓冲池的一部分)是否仅限于哈希联接、排序等?
如果我有一个使用嵌套循环连接(没有排序或散列)的查询,它会不会使用工作区内存?
将在何处创建返回 100 行的简单查询的工作表?在 Tempdb..
如果查询没有内存授权,则它无法从此“工作区”请求内存。您可以在sys.dm_exec_query_memory_grants. 正如您已经注意到的,只有某些操作符请求内存授权,即需要一些重要中间存储的操作符。嵌套循环不需要任何存储,因为它一次运行一行,因此它不会请求内存授予。散列需要内存来构建散列表,而排序显然需要排序表。没有授权的查询仍然需要一些内存,但这加起来是微不足道的(可能是几 KB),而这些内存是从普通执行分配器中获得的。授权通常以 MB 为单位,可以达到 100 MB。
为授权保留的内存并不完全是“缓冲池的一部分”,这听起来像是缓冲池的一个单独部分。更多的是灰色地带。内存授予由缓冲池支持。被授予 X 内存量的查询在 BP 上放置了一个保留。它不会立即“窃取”BP 的页面。但是由于(未窃取的部分)BP 包含数据页,BP 可以兑现保留承诺,因为它可以随时将数据页驱逐到磁盘。随着查询的进行,它可能会从它获得的授权(从预留)中向 BP 请求页面,并且当 BP 满足请求时,分发给查询的页面变得真正“被盗”,即。BP 不能再将它们用于数据,直到查询将它们释放回来。为了确保所有授权都可以兑现,预留的总和不能超过 BP 大小(即没有 VM 风格的过度分配)。这些授权预留往往会在过度分配方面出错,幅度很大,因为如果查询消耗了所有授权并且 styl 需要内存,事情会变得非常丑陋:发生溢出(非常慢)或者查询可能会放弃并出错。