SQL Server 中 MPA(多页分配)的使用者是什么?
我知道数据页总是 8K。是否存在数据/索引页面使用 MPA 的情况?执行计划可以使用 MPA 是有道理的,因为它们可以超过 8 KB。
这里有一个博客建议使用 MPA,但它指的是存储过程(一个有 500 个参数的过程)。在随附的屏幕截图中,我看到一个使用大约 11 MB 的执行计划;这使用 MPA 吗?有没有办法确认执行计划的内存分配是使用多页分配?
我的困惑是实际使用 MPA(多页分配器)。我发布的链接中的示例显示了一个复杂的执行计划,它将需要超过 8 KB 的连续分配。
下面的答案表明有很多东西可以使用 MPA 的链接服务器或扩展存储过程。出于某种原因,我不能同意。例如,扩展存储过程可以是使用 HeapAlloc 的 C++ 代码,SQL 服务器几乎无法控制它来管理其内存(它必须在 Windows 操作系统级别)。
即使在 SQL 2012 中,扩展存储过程仍然会消耗缓冲池之外的内存,因此它与多页分配无关。这同样适用于链接服务器,特别是如果您使用第三方提供商(例如 ORACLE)。
在 SQL Server 2008 R2 及更早版本中,以下分配来自 MemToLeave (MTL) 区域:
MAXTRANSFERSIZE
Microsoft 支持工程师 Amit Banerjee从本文中提取的信息。
SQL Server 2012 使用Any Size Page Allocator。
此 Microsoft 知识库文章中包含更多信息。
在 SQL Server 2012 之前,多页分配 (MPA) 也来自 MTL 区域。SQL Server 进行的分配是通过 MPA 还是单页分配器 (SPA) 进行的,完全取决于分配请求的大小。如果是 8KB 或更少,则通过 SPA 分配并从缓冲池中窃取。如果是 8KB 或更大,则使用 MPA。
不,数据和索引页始终缓存在缓冲池中。
缓存计划具有复杂的结构。该结构中的单个分配通常是 8KB 分配,但某些查询(通常是那些包含长
IN
列表或存储过程调用的许多参数的查询)可能需要 MPA 分配。这些比较少见。可以查询 SQL Server DMV以确定缓存计划的 SPA 和 MPA 之间的拆分。