小编Gor*_*ddy的帖子

规划缓存大小和保留内存

运行包含实际执行计划的查询时,根运算符 ( SELECT) 告诉我缓存计划大小为 32KB。

该连接的查询sys.dm_exec_cached_planssys.dm_os_memory_objects,看问题的计划,称该值pages_in_bytesmax_pages_in_bytes为32768(32KB),它匹配缓存计划的大小。

我不明白的是 中的值sys.dm_exec_cached_plans.size_in_bytes,即 49152 (48KB) 代表什么。我已经阅读了所有这些专栏的 BOL,特别是size_in_bytes其中说:

"缓存对象消耗的字节数。 "

我无法解决最后一点难题,无法理解它的真正含义。

我知道所有操作符(不是谈论用于排序和散列的额外内存授予)都需要一定数量的固定内存,以存储状态、进行计算等,这些内存与缓存中的优化计划一起存储,但在哪里?

所以,我的问题是:

  • 什么size_in_bytes意思
  • 为什么它的值高于“缓存计划大小”?
  • 所有运算符/迭代器的固定内存量在哪里保留,是“缓存计划大小”(在我的示例中为 32Kb),还是其他任何地方?

我知道它们是具有不同功能的不同 DMV,但它们是相关的。在编译(缓存)计划sys.dm_exec_cached_plans加入sys.dm_os_memory_objectsmemory_object_address列。我在这里发布问题的原因是我在寻求帮助,了解如何解释 DMV 及其专栏。

如果size_in_bytes是缓存计划大小,为什么SQL Server在实际执行计划中说另一个值?

新查询,新号码:

  • 实际计划
    • 缓存计划大小 16KB
    • 编译内存 96KB
  • DMV:
    • sys.dm_exec_cached_plans.size_in_bytes 24KB
    • sys.dm_os_memory_objects.pages_in_bytes, .max_pages_in_bytes 16KB。

另请注意,此查询不需要为排序和散列操作分配任何额外的内存。

Microsoft SQL Server 2012 - 11.0.5343.0 (X64)

sql-server memory dmv sql-server-2012 plan-cache

19
推荐指数
1
解决办法
5139
查看次数

为什么嵌套循环连接只支持左连接?

在 Craig Freedman 的博客Nested Loops Join 中,他解释了为什么嵌套循环联接不能支持右外联接

问题是我们多次扫描内表——外连接的每一行扫描一次。在这些多次扫描期间,我们可能会多次遇到相同的内部行。在什么时候我们可以得出结论,特定的内部行没有或不会加入?

有人可以用一种非常简单和有教育意义的方式解释一下吗?

这是否意味着循环从外表 ( R1) 开始并扫描内表 ( R2)?

我知道对于R1不与 连接的值,R2应将其替换为 aNULL以便结果集变为 ( NULL, R2)。对我来说,R2R1不加入时似乎不可能返回一个值,因为它不知道R2要返回哪个值。但这不是它的解释方式。或者是吗?

SQL Server会在事实上优化(经常替换)RIGHT JOINLEFT JOIN,但问题是解释为什么它在技术上是不可能的NESTED LOOPS JOIN使用/支持RIGHT JOIN逻辑。

join sql-server database-internals

11
推荐指数
2
解决办法
1525
查看次数