KB3170112引入了显示计划 XML 架构 SQL Server 2014 或 2016 的新属性。
MemoryGrantInfo 下的 MaxQueryMemory:如果查询需要内存才能运行,则可用于单个查询授权的最大内存量(以 KB 为单位)。
属性GrantedMemory
在上面公布之前就已经存在。现在两者都在 Showplan XML 中。
这是一个例子:
从上图中,如果我添加的值RequestedMemory
和RequiredMemory
总计 =62,864 KB。295,344 KB 的值MaxQueryMemory
来自哪里,或者该值的真正含义是什么?
我还查看了2017 Schema,其定义如下。
MaxQueryMemory:单个查询允许的最大内存(以 KB 为单位)。
它是您可以从sys.dm_exec_query_resource_semaphores获得的相同信息的快照。我认为这
target_memory_kb
是常规资源信号量乘以执行查询的资源调控器组的最大查询授权百分比。如果未启用 RG,则只需使用默认值 25%。在我查看的服务器上,我通常会看到大约 28% 的服务器内存不可用于查询内存授权。因此,一旦我运行了一个工作负载,可用于查询的最大查询授权就是 0.25 * 0.72 *
MaxServerMemory
。下面是一个您可以运行的查询,它几乎立即完成但需要大量内存授予:
如果我强制该查询超时,那么我会在实际计划中得到以下内容:
MaxQueryMemory
不会因超时而改变。它不受当前正在执行和使用查询内存的其他查询的直接影响。它会间接受到任何更改资源池目标内存 KB 的影响。如果您有一堆不同的 Resource Governor 池和组并且想要验证查询是否到达正确的位置,则此信息可能很有用。它还可以提供有关您无权访问的服务器的总大小或配置的上下文。这是判断查询是否超时等待内存授予的另一种方法,但已经有其他方法可以做到这一点。预期的用例可能是提供有关服务器上目标内存变化很大引起的性能问题的更多信息,但我个人从未见过这种情况。也许它会发生在运行多个 SQL Server 实例的服务器上?
我引用同一篇支持文章更新来公开在 SQL Server 2014 或 2016 中为 Showplan XML 中的单个查询启用的最大内存
这意味着如果查询在处理过程中请求内存,则在“当前”情况下可以授予查询的最大内存量。该值是在查询运行时计算的,考虑到其他查询运行的内存要求和使用的系统内存。这对于解决运行缓慢的慢速查询很有用,因为统计数据是倾斜的,优化器准备了次优计划,这会强制查询请求与运行时实际需要的内存不同的内存。当它请求比要求的高得多时,查询变得非常慢,因为它没有被授予它需要的内存。这也有助于了解系统是否存在内存压力。
GrantedQueryMemory
OTOH 表示“实际”授予的内存总量,以千字节为单位。如果尚未授予内存,则可以为 NULL。MaxQueryMemory
表示可以授予的最大值。值得一读的博客。了解查询内存授权