sys.dm_os_memory_clerks (Transact-SQL)

适用于SQL Server Azure SQL 数据库 Azure SQL 托管实例 Azure Synapse Analytics Analytics Platform System (PDW)

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

注意

若要从 Azure Synapse Analytics 或 Analytics 平台系统(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 查找绑定到此 clerk 的内存对象。 不可为 null。
host_address varbinary(8) 指定用于此内存分配器的主机的内存地址。 有关详细信息,请参阅sys.dm_os_hosts(Transact-SQL)。 组件(例如Microsoft SQL Server Native Client)通过主机接口访问 SQL Server 内存资源。

0x00000000 = 内存 clerk 属于 SQL Server。

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

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

权限

在 SQL Server 上,需要 VIEW SERVER STATE 权限。
在Azure SQL 数据库基本、S0 和 S1 服务目标以及弹性池中的数据库,需要服务器管理员帐户或Microsoft Entra 管理员帐户。 在所有其他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 缓存

类型

下表列出了内存 clerk 类型:

类型 描述
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 此内存职员用于全文引擎分配 非索引字表 功能。
CACHESTORE_NOTIF 此缓存存储用于查询 通知 功能的分配
CACHESTORE_OBJCP 此缓存存储用于缓存具有编译计划的对象(CP):存储过程、函数、触发器。 为了说明,创建存储过程的查询计划后,其计划将存储在此缓存中。
CACHESTORE_PHDR 此缓存存储用于在分析视图、约束和编译查询期间的默认 algebrizer 树的临时内存缓存。 分析查询后,应释放内存。 一些示例包括:一批中的许多语句 - 成千上万个插入或更新到一个批处理,一个包含大量动态生成的查询的 T-SQL 批处理,一个 IN 子句中的大量值。
CACHESTORE_QDSRUNTIMESTATS 此缓存存储用于缓存查询存储运行时统计信息
CACHESTORE_SEARCHPROPERTYLIST 此缓存存储用于属性列表缓存的全文引擎分配
CACHESTORE_SEHOBTCOLUMNATTRIBUTE 此缓存存储由存储引擎用于缓存堆或 B 树(HoBT)列元数据结构。
CACHESTORE_SQLCP 此缓存存储用于缓存计划缓存中的即席查询、准备语句和服务器端游标。 即席查询通常是在未显式参数化的情况下提交到服务器的语言事件 T-SQL 语句。 准备的语句也使用此缓存存储 - 应用程序使用 API 调用(如 SQLPrepare()SQLExecute(ODBC)/ 或 SqlCommand.Prepare/SqlCommand.ExecuteNonQuery(ADO.NET)提交,并将在服务器上显示为sp_prepare sp_execute/或sp_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 活动(如 XQuery的 XML 元素结构。
CACHESTORE_XMLDBTYPE 此缓存存储用于缓存 XML 活动的 XML 结构,例如 XQuery。
CACHESTORE_XPROC 此缓存存储用于计划缓存中扩展存储过程(Xprocs)的缓存结构
MEMORYCLERK_BACKUP 此内存分配器用于备份功能的各种分配
MEMORYCLERK_BHF 此内存职员用于在查询执行期间进行二进制大型对象(BLOB)管理的分配(Blob 句柄支持)
MEMORYCLERK_BITMAP 此内存分配器用于按 SQL OS 功能进行位图筛选的分配
MEMORYCLERK_CSILOBCOMPRESSION 此内存 clerk 用于列存储索引二进制大型对象 (BLOB) 压缩的分配
MEMORYCLERK_DRTLHEAP 此内存 clerk 用于 SQL OS 功能的分配

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

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

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

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

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

适用于: SQL Server 2019 (15.x) 及更高版本
MEMORYCLERK_SERIALIZATION 仅限内部使用
MEMORYCLERK_SLOG 此内存 clerk 用于加速数据库恢复中的 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 空间数据组件使用此内存分配器进行内存分配。
MEMORYCLERK_SQLBUFFERPOOL 此内存职员跟踪 SQL Server 中最大的内存使用者 - 数据和索引页。 缓冲池或数据缓存保留内存中加载的数据和索引页,以便快速访问数据。 有关详细信息,请参阅 缓冲区管理
MEMORYCLERK_SQLCLR 此内存职员用于 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 SQL Server 日志池使用此内存 clerk。 日志池是一个缓存,用于在读取事务日志时提高性能。 具体而言,它在多次日志读取期间改进了日志缓存利用率,减少了磁盘 I/O 日志读取并允许共享日志扫描。 日志池的主要使用者是 AlwaysOn(更改捕获和发送)、重做管理器、数据库恢复 - 分析/恢复/撤消、事务运行时回滚、复制/CDC、备份/还原。
MEMORYCLERK_SQLOPTIMIZER 此内存分配器用于编译查询的不同阶段的内存分配。 有些用途包括查询优化、索引统计信息管理器、视图定义编译、直方图生成。
MEMORYCLERK_SQLQERESERVATIONS 此内存 clerk 用于内存授予分配,即分配给查询的内存,以便在查询执行期间执行排序和哈希操作。 有关查询执行预留(内存授予)的详细信息,请参阅 此博客
MEMORYCLERK_SQLQUERYCOMPILE 查询优化器使用此内存 cler 在查询编译期间分配内存。
MEMORYCLERK_SQLQUERYEXEC 此内存 clerk 用于以下区域中的分配:批处理模式处理并行查询执行、查询执行上下文、空间索引分割排序和哈希操作(排序表、哈希表)、某些 DVM 处理、更新统计信息执行
MEMORYCLERK_SQLQUERYPLAN 此内存 clerk 用于堆页管理、DBCC CHECKTABLE 分配和sp_cursor* 存储过程分配的分配
MEMORYCLERK_SQLSERVICEBROKER SQL Server Service Broker 内存分配使用此内存 clerk。
MEMORYCLERK_SQLSERVICEBROKERTRANSPORT SQL Server Service Broker 传输内存分配使用此内存 clerk。
MEMORYCLERK_SQLSLO_OPERATIONS 此内存职员用于收集性能统计信息

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

适用于: Azure SQL 数据库
MEMORYCLERK_XTP 此内存 clerk 用于 内存中 OLTP 内存分配。
OBJECTSTORE_LBSS 此对象存储用于为表达式分配临时 BLOB - 变量、参数和中间结果。 使用此存储的示例是 表值参数 (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)