sys.dm_os_memory_clerks (Transact-SQL)

适用于:SQL ServerAzure SQL 数据库Azure SQL 托管实例Azure Synapse AnalyticsAnalytics Platform System (PDW)

返回当前在 SQL Server 实例中处于活动状态的所有内存分配器集。

注意

若要从 Azure Synapse Analytics 或 Analytics Platform System (PDW) 调用此名称,请使用名称sys.dm_pdw_nodes_os_memory_clerks。 Azure Synapse Analytics 中的无服务器 SQL 池不支持此语法。

列名称 数据类型 说明
memory_clerk_address varbinary(8) 指定内存分配器的唯一内存地址。 这是主键列。 不可为 null。
type nvarchar(60) 指定内存分配器的类型。 每个分配器都具有特定类型,例如,CLR Clerks MEMORYCLERK_SQLCLR。 不可为 null。
name nvarchar(256) 指定在内部为此内存分配器分配的名称。 一个组件可拥有多个特定类型的内存分配器。 组件可选择使用特定名称来标识相同类型的内存分配器。 不可为 null。
memory_node_id smallint 指定内存节点的 ID。 不可为 Null。
single_pages_kb bigint 适用于:SQL Server 2008 (10.0.x) 至 SQL Server 2008 R2 (10.50.x)。 有关详细信息,请参阅从 SQL Server 2012 (11.x) 开始对内存管理的更改
pages_kb bigint 适用于:SQL Server 2012 (11.x) 及更高版本。

指定为此内存分配器分配的页内存量 (KB)。 不可为 null。
multi_pages_kb bigint 适用于:SQL Server 2008 (10.0.x) 至 SQL Server 2008 R2 (10.50.x)。 有关详细信息,请参阅从 SQL Server 2012 (11.x) 开始对内存管理的更改

分配的多页内存量 (KB)。 这是使用内存节点的多页分配器分配的内存量。 此内存在缓冲池外面分配,利用了内存节点虚拟分配器的优势。 不可为 null。
virtual_memory_reserved_kb bigint 指定内存分配器保留的虚拟内存量。 不可为 null。
virtual_memory_committed_kb bigint 指定内存分配器提交的虚拟内存量。 提交的内存量应始终小于保留的内存量。 不可为 null。
awe_allocated_kb bigint 指定在物理内存中锁定且未由操作系统调出的内存量 (KB) 。 不可为 null。
shared_memory_reserved_kb bigint 指定内存分配器保留的共享内存量。 保留以供共享内存和文件映射使用的内存量。 不可为 null。
shared_memory_committed_kb bigint 指定内存分配器提交的共享内存量。 不可为 null。
page_size_in_bytes bigint 指定此内存分配器的页分配粒度。 不可为 null。
page_allocator_address varbinary(8) 指定页分配器的地址。 此地址对于内存分配器是唯一的,可在 sys.dm_os_memory_objects 中用于定位绑定到此分配器的内存对象。 不可为 null。
host_address varbinary(8) 指定用于此内存分配器的主机的内存地址。 有关详细信息,请参阅 sys.dm_os_hosts (Transact-SQL) 。 组件(如 Microsoft SQL Server Native Client)通过主机接口访问SQL Server内存资源。

0x00000000 = 内存分配器属于SQL Server。

不可为 null。
pdw_node_id int 适用于:Azure Synapse Analytics、Analytics Platform System (PDW)

此分发所在节点的标识符。

权限

在 SQL Server 上,需要 VIEW SERVER STATE 权限。
在 Azure SQL Database Basic、S0 和 S1 服务目标上,对于弹性池中的数据库,需要服务器管理员帐户或 Azure Active Directory 管理员帐户。 对于所有其他Azure SQL数据库服务目标,VIEW DATABASE STATE数据库中需要 权限。

SQL Server 2022 及更高版本的权限

需要对服务器具有 VIEW SERVER PERFORMANCE STATE 权限。

备注

SQL Server内存管理器由三层层次结构组成。 该层次结构的底层为内存节点。 中间层由内存分配器、内存缓存和内存池组成。 顶层由内存对象组成。 这些对象用于在 SQL Server 实例中分配内存。

内存节点提供低级分配器的界面和实现。 在 SQL Server 中,只有内存职员有权访问内存节点。 内存分配器访问内存节点界面以分配内存。 内存节点还会跟踪 Clerk 分配的内存以进行诊断。 分配大量内存的每个组件,都必须使用分配器界面来创建其自己的内存分配器并分配其全部内存。 通常,组件会在启动SQL Server时创建相应的职员。

CACHESTORE 和 USERSTORE

CACHESTORE 和 USERSTORE 是内存职员,但充当实际缓存。 通常,缓存会保留分配,直到缓存删除策略释放这些分配。 为避免重新创建它,缓存分配会尽可能长时间地保留在缓存中,并且通常当它太旧而无法使用时,或者当需要内存空间来获取新信息时, (有关详细信息,请参阅 时钟手动扫描) 。 这是缓存的两个主要控件之一 - 生存期控制和可见性控制。

缓存存储和用户存储在控制分配生存期的方式上有所不同。 对于缓存存储,条目的生存期完全由 SQLOS 的缓存框架控制。 使用用户存储时,条目生存期仅部分由存储控制。 每个用户存储的实现可能特定于内存分配的性质,因此用户存储参与其条目的生存期控制。

可见性控件管理条目的可见性。 缓存中的条目可以存在,但可能不可见。 例如,如果缓存条目标记为仅供一次性使用,则使用该条目后将不可见。 此外,缓存条目可能标记为脏;它将继续位于缓存中,但对任何查找都不可见。 对于这两个存储,条目可见性由缓存框架控制。

有关详细信息,请参阅 SQLOS 缓存

OBJECTSTORE

对象存储是一个简单的池。 它用于缓存同质数据。 池中的所有项都被视为是等同的。 对象存储实现最大上限,以控制相对于其他缓存的大小。

有关详细信息,请参阅 SQLOS 缓存

类型

下表列出了内存职员类型:

类型 说明
CACHESTORE_BROKERDSH 此缓存存储用于存储 Service Broker 对话框安全标头缓存的分配
CACHESTORE_BROKERKEK 此缓存存储用于存储 Service Broker 密钥交换密钥缓存的分配
CACHESTORE_BROKERREADONLY 此缓存存储用于存储 Service Broker 只读缓存的分配
CACHESTORE_BROKERRSB 此缓存存储用于存储 Service Broker远程服务绑定 缓存的分配。
CACHESTORE_BROKERTBLACS 此缓存存储用于存储 Service Broker 的安全访问结构的分配。
CACHESTORE_BROKERTO 此缓存存储用于存储 Service Broker传输对象 缓存的分配
CACHESTORE_BROKERUSERCERTLOOKUP 此缓存存储用于存储 Service Broker 用户证书查找缓存的分配
CACHESTORE_COLUMNSTOREOBJECTPOOL 此缓存存储用于由字典列存储索引进行分配
CACHESTORE_CONVPRI 此缓存存储用于存储 Service Broker 的分配,以跟踪 对话优先级
CACHESTORE_EVENTS 此缓存存储用于存储 Service Broker事件通知的分配
CACHESTORE_FULLTEXTSTOPLIST 此内存操作程序由Full-Text引擎用于分配 非索引表 功能。
CACHESTORE_NOTIF 此缓存存储用于 通过查询通知 功能进行分配
CACHESTORE_OBJCP 此缓存存储用于缓存具有编译计划的对象, (CP) :存储过程、函数、触发器。 为了说明,创建存储过程的查询计划后,其计划将存储在此缓存中。
CACHESTORE_PHDR 在编译查询期间,此缓存存储用于分析视图、约束和默认值 algebrizer 树的临时内存缓存。 分析查询后,应释放内存。 一些示例包括:一批中的许多语句 - 一个批处理中的数千次插入或更新,一个包含大型动态生成的查询的 T-SQL 批处理,IN 子句中存在大量值。
CACHESTORE_QDSRUNTIMESTATS 此缓存存储用于缓存查询存储运行时统计信息
CACHESTORE_SEARCHPROPERTYLIST 此缓存存储用于 属性列表 缓存Full-Text引擎的分配
CACHESTORE_SEHOBTCOLUMNATTRIBUTE 存储引擎使用此缓存存储来缓存堆或 B 树 (HoBT) 列元数据结构。
CACHESTORE_SQLCP 此缓存存储用于缓存计划缓存中的即席查询、准备语句和服务器端游标。 即席查询是提交到服务器的通常语言事件 T-SQL 语句,无需显式参数化。 准备好的语句也使用此缓存存储区 - 应用程序使用 SQLPrepare () / SQLExecute (ODBC) 或 SqlCommand.Prepare/SqlCommand.ExecuteNonQuery (ADO.NET) 的 API 调用提交它们,并在服务器上显示为 sp_prepare/sp_executesp_prepexec 系统过程执行。 此外,服务器端游标将使用此缓存存储 (sp_cursoropensp_cursorfetchsp_cursorclose) 。
CACHESTORE_STACKFRAMES 此缓存存储用于分配与堆栈帧相关的内部 SQL OS 结构。
CACHESTORE_SYSTEMROWSET 此缓存存储用于分配与事务日志记录和恢复相关的内部结构。
CACHESTORE_TEMPTABLES 此缓存存储用于与 临时表和表变量缓存 相关的分配 - 计划缓存的一部分。
CACHESTORE_VIEWDEFINITIONS 此缓存存储用于在查询优化过程中缓存视图定义。
CACHESTORE_XML_SELECTIVE_DG 此缓存存储用于缓存 XML 结构以便进行 XML 处理。
CACHESTORE_XMLDBATTRIBUTE 此缓存存储用于缓存 XML 活动(如 XQuery)的 XML 属性结构。
CACHESTORE_XMLDBELEMENT 此缓存存储用于缓存 XML 活动的 XML 元素结构,例如 XQuery
CACHESTORE_XMLDBTYPE 此缓存存储用于缓存 XML 活动的 XML 结构,例如 XQuery。
CACHESTORE_XPROC 此缓存存储用于缓存扩展 存储过程的结构, (计划缓存中的 Xprocs)
MEMORYCLERK_BACKUP 此内存职员用于 备份 功能的各种分配
MEMORYCLERK_BHF 此内存管理器用于在查询执行期间 (BLOB) 管理的二进制大型对象分配 (Blob 句柄支持)
MEMORYCLERK_BITMAP 此内存职员用于由 SQL OS 功能分配位图筛选
MEMORYCLERK_CSILOBCOMPRESSION 此内存 clerk 用于由列存储索引二进制大型对象 (BLOB) 压缩进行分配
MEMORYCLERK_DRTLHEAP 此内存职员用于 SQL OS 功能分配

适用于:SQL Server 2019 (15.x) 及更高版本
MEMORYCLERK_EXPOOL 此内存职员用于 SQL OS 功能分配

适用于:SQL Server 2019 (15.x) 及更高版本
MEMORYCLERK_EXTERNAL_EXTRACTORS 此内存 clerk 用于查询执行引擎对 批处理模式 操作进行分配

适用于:SQL Server 2019 (15.x) 及更高版本
MEMORYCLERK_FILETABLE 此内存 clerk 用于 FileTables 功能的各种分配。
MEMORYCLERK_FSAGENT 此内存管理器用于 FILESTREAM 功能的各种分配。
MEMORYCLERK_FSCHUNKER 此内存 clerk 用于 FILESTREAM 功能的各种分配,用于创建文件流区块。
MEMORYCLERK_FULLTEXT 此内存 clerk 用于Full-Text引擎结构的分配。
MEMORYCLERK_FULLTEXT_SHMEM 此内存职员用于分配Full-Text与全文守护程序进程共享内存连接相关的引擎结构。
MEMORYCLERK_HADR 此内存职员通过Always On功能用于内存分配
MEMORYCLERK_HOST 此内存 clerk 用于由 SQL OS 功能进行分配。
MEMORYCLERK_LANGSVC 此内存 clerk 用于由 SQL T-SQL 语句和命令 (分析程序、algebrizer 等进行分配)
MEMORYCLERK_LWC 此内存 clerk 用于Full-Text 语义搜索引擎 的分配
MEMORYCLERK_POLYBASE 此内存职员跟踪 SQL Server 中 PolyBase 功能的内存分配。
MEMORYCLERK_QSRANGEPREFETCH 此内存 clerk 用于在查询扫描范围预提取的查询执行期间进行分配。
MEMORYCLERK_QUERYDISKSTORE 此内存 clerk 由SQL Server中的查询存储内存分配使用。
MEMORYCLERK_QUERYDISKSTORE_HASHMAP 此内存 clerk 由SQL Server中的查询存储内存分配使用。
MEMORYCLERK_QUERYDISKSTORE_STATS 此内存 clerk 由SQL Server中的查询存储内存分配使用。
MEMORYCLERK_QUERYPROFILE 此内存管理器用于在服务器启动期间启用查询分析

适用于:SQL Server 2019 (15.x) 及更高版本
MEMORYCLERK_RTLHEAP 此内存 clerk 用于由 SQL OS 功能进行分配。

适用于:SQL Server 2019 (15.x) 及更高版本
MEMORYCLERK_SECURITYAPI 此内存 clerk 用于由 SQL OS 功能进行分配。

适用于:SQL Server 2019 (15.x) 及更高版本
MEMORYCLERK_SERIALIZATION 仅限内部使用
MEMORYCLERK_SLOG 此内存管理员用于由加速数据库恢复中的 sLog (辅助内存中日志流) 进行分配

适用于:SQL Server 2019 (15.x) 及更高版本
MEMORYCLERK_SNI 此内存职员为服务器网络接口 (SNI) 组件分配内存。 SNI 管理SQL Server的连接和 TDS 数据包
MEMORYCLERK_SOSMEMMANAGER 此内存管理员为 SQLOS (SOS 分配结构,) 线程计划以及内存和 I/O 管理。
MEMORYCLERK_SOSNODE 此内存管理员为 SQLOS (SOS 分配结构,) 线程计划以及内存和 I/O 管理。
MEMORYCLERK_SOSOS 此内存管理员为 SQLOS (SOS 分配结构,) 线程计划以及内存和 I/O 管理。
MEMORYCLERK_SPATIAL 空间数据组件使用此内存 clerk 进行内存分配。
MEMORYCLERK_SQLBUFFERPOOL 此内存职员跟踪SQL Server中通常最大的内存使用者 - 数据和索引页。 缓冲池或数据缓存会将数据和索引页保留在内存中,以提供对数据的快速访问。 有关详细信息,请参阅 缓冲区管理
MEMORYCLERK_SQLCLR 此内存 clerk 用于 SQLCLR 的分配。
MEMORYCLERK_SQLCLRASSEMBLY 此内存 clerk 用于 SQLCLR 程序集的分配。
MEMORYCLERK_SQLCONNECTIONPOOL 此内存 clerk 在客户端应用程序可能需要服务器跟踪的服务器上缓存信息。 一个示例是通过 sp_prepexecrpc创建准备句柄的应用程序。 执行后,应用程序应正确取消准备, (关闭这些句柄) 。
MEMORYCLERK_SQLEXTENSIBILITY 此内存 clerk 用于由扩展性框架分配,以便在SQL Server上运行外部 Python 或 R 脚本。

适用于:SQL Server 2019 (15.x) 及更高版本
MEMORYCLERK_SQLGENERAL 此内存 clerk 可由 SQL 引擎中的多个使用者使用。 示例包括复制内存、内部调试/诊断、某些SQL Server启动功能、某些 SQL 分析程序功能、生成系统索引、初始化全局内存对象、在服务器和链接服务器查询中创建 OLEDB 连接、服务器端探查器跟踪、创建 showplan 数据、某些安全功能、计算列编译、并行结构的内存、某些 XML 的内存 功能
MEMORYCLERK_SQLHTTP 已放弃
MEMORYCLERK_SQLLOGPOOL 此内存 clerk 由 SQL Server 日志池使用。 日志池是用于在读取事务日志时提高性能的缓存。 具体而言,它可以提高多次日志读取期间的日志缓存利用率,减少磁盘 I/O 日志读取,并允许共享日志扫描。 日志池的主要使用者是Always On (更改捕获和发送) 、Redo Manager、数据库恢复 - 分析/恢复/撤消、事务运行时回滚、复制/CDC、备份/还原。
MEMORYCLERK_SQLOPTIMIZER 此内存职员用于编译查询的不同阶段的内存分配。 某些用途包括查询优化、索引统计信息管理器、视图定义编译、直方图生成。
MEMORYCLERK_SQLQERESERVATIONS 此内存 clerk 用于内存授予分配,即分配给查询的内存,以便在查询执行期间执行排序和哈希操作。 有关查询执行预留 (内存授予) 的详细信息,请参阅 此博客
MEMORYCLERK_SQLQUERYCOMPILE 查询优化器使用此内存 clerk 在查询编译期间分配内存。
MEMORYCLERK_SQLQUERYEXEC 此内存职员用于以下领域的分配: 批处理模式处理并行查询 执行、查询执行上下文、 空间索引分割、排序和哈希操作 (排序表、哈希表) 、某些 DVM 处理、 更新统计信息 执行
MEMORYCLERK_SQLQUERYPLAN 此内存管理员 用于堆页 管理、 DBCC CHECKTABLE 分配和 sp_cursor* 存储过程 分配的分配
MEMORYCLERK_SQLSERVICEBROKER 此内存 clerk 由 SQL Server Service Broker 内存分配使用。
MEMORYCLERK_SQLSERVICEBROKERTRANSPORT 此内存 clerk 由 SQL Server Service Broker 传输内存分配使用。
MEMORYCLERK_SQLSLO_OPERATIONS 此内存职员用于收集性能统计信息

适用于:Azure SQL 数据库
MEMORYCLERK_SQLSOAP 已放弃
MEMORYCLERK_SQLSOAPSESSIONSTORE 已放弃
MEMORYCLERK_SQLSTORENG 此内存 clerk 用于由多个存储引擎组件进行分配。 组件示例包括数据库文件的结构、数据库快照 副本 (replica) 文件管理器、死锁监视器、DBTABLE 结构、日志管理器结构、一些 tempdb 版本控制结构、某些服务器启动功能、并行查询中子线程的执行上下文。
MEMORYCLERK_SQLTRACE 此内存 clerk 用于服务器端 SQL 跟踪 内存分配。
MEMORYCLERK_SQLUTILITIES 此内存分配器可由SQL Server内的多个分配器使用。 示例包括备份和还原、日志传送、数据库镜像、DBCC 命令、服务器端的 BCP 代码、一些查询并行工作、日志扫描缓冲区。
MEMORYCLERK_SQLXML 执行 XML 操作时,此内存 clerk 用于内存分配。
MEMORYCLERK_SQLXP 调用扩展存储过程时,此内存 clerk 用于内存分配SQL Server。
MEMORYCLERK_SVL 此内存职员用于分配内部 SQL OS 结构
MEMORYCLERK_TEST 仅限内部使用
MEMORYCLERK_UNITTEST 仅限内部使用
MEMORYCLERK_WRITEPAGERECORDER 此内存职员用于由写入页记录器进行分配。
MEMORYCLERK_XE 此内存职员用于 扩展事件 内存分配
MEMORYCLERK_XE_BUFFER 此内存职员用于 扩展事件 内存分配
MEMORYCLERK_XLOG_SERVER 此内存 clerk 用于 Xlog 的分配,用于在 SQL Azure 数据库中管理日志文件

适用于:Azure SQL 数据库
MEMORYCLERK_XTP 此内存 clerk 用于 内存中 OLTP 内存分配。
OBJECTSTORE_LBSS 此对象存储用于为表达式分配临时 LOB - 变量、参数和中间结果。 使用此存储的一个示例是 TVP) (表值参数 。 有关此空间中的修复的详细信息,请参阅 知识库文章4468102知识库文章4051359
OBJECTSTORE_LOCK_MANAGER 此内存职员跟踪锁管理器在 SQL Server 进行的分配。
OBJECTSTORE_SECAUDIT_EVENT_BUFFER 此对象存储用于SQL Server审核内存分配。
OBJECTSTORE_SERVICE_BROKER Service Broker 使用此对象存储
OBJECTSTORE_SNI_PACKET 此对象存储由管理连接的服务器网络接口 (SNI) 组件使用
OBJECTSTORE_XACT_CACHE 此对象存储用于缓存事务信息
USERSTORE_DBMETADATA 此对象存储用于元数据结构
USERSTORE_OBJPERM 此存储用于跟踪对象安全性/权限的结构
USERSTORE_QDSSTMT 此缓存存储用于缓存查询存储语句
USERSTORE_SCHEMAMGR 架构管理器缓存将有关数据库对象的不同类型的元数据信息存储在内存中, (例如表) 。 此存储的常见用户可能是具有表、临时过程、表变量、表值参数、工作表、工作文件、版本存储等对象的 tempdb 数据库。
USERSTORE_SXC 此用户存储用于分配以存储所有 RPC 参数。
USERSTORE_TOKENPERM TokenAndPermUserStore 是一个 SOS 用户存储,用于跟踪安全上下文、登录、用户、权限和审核的安全条目。 分配多个哈希表来存储这些对象。

注意

SQL Server 文档在提到索引时一般使用 B 树这个术语。 在行存储索引中,SQL Server 实现了 B+ 树。 这不适用于列存储索引或内存中数据存储。 有关详细信息,请参阅SQL Server和Azure SQL索引体系结构和设计指南

另请参阅

与 SQL Server 操作系统相关的动态管理视图 (Transact-SQL)
sys.dm_os_sys_info (Transact-SQL)
sys.dm_exec_query_memory_grants (Transact-SQL)
sys.dm_exec_requests (Transact-SQL)
sys.dm_exec_query_plan (Transact-SQL)
sys.dm_exec_sql_text (Transact-SQL)