sys.dm_os_memory_clerks (Transact-SQL)

适用于:SQL Server (所有受支持的版本) Azure SQL数据库Azure SQL 托管实例 Azure Synapse Analytics Platform System (PDW)

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

注意

若要从 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 到 SQL Server 2008 R2。 有关详细信息,请参阅从 2012 SQL Server 2012 (11.x) 开始的内存管理更改
pages_kb bigint 适用于:SQL Server 2012 (11.x) 及更高版本。

指定为此内存分配器分配的页内存量 (KB)。 不可为 null。
multi_pages_kb bigint 适用范围: SQL Server 2008 到 SQL Server 2008 R2。 有关详细信息,请参阅从 2012 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) 指定页分配器的地址。 此地址对于内存 clerk 是唯一的,可用于 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 = 内存职员属于SQL Server。

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

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

权限

在 SQL Server 上,需要 VIEW SERVER STATE 权限。
在Azure SQL数据库基本、S0 和 S1 服务目标以及弹性池中的数据库,需要服务器管理员帐户或 Azure Active Directory 管理员帐户。 在所有其他Azure SQL数据库服务目标上,VIEW DATABASE 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 Key Exchange 密钥缓存的分配
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 此内存 clerk 用于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 语句。 准备的语句还使用此缓存存储 - 应用程序使用 API 调用(如 SQLPrepare () / SQLExecute (ODBC) 或 SqlCommand.Prepare/SqlCommand.ExecuteNonQuery (ADO.NET) )提交,并将在服务器上显示为 sp_prepare/sp_executesp_prepexec 系统过程执行。 此外,服务器端游标将使用此缓存存储 (sp_cursoropen、sp_cursorfetch、sp_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 活动(如 XQuery)的 XML 结构。
CACHESTORE_XPROC 此缓存存储用于在计划缓存中 (Xprocs) 扩展存储过程 的缓存结构。
MEMORYCLERK_BACKUP 此内存服务员通过 备份 功能用于各种分配
MEMORYCLERK_BHF 此内存 clerk 用于在查询执行期间 (BLOB) 管理的二进制大型对象分配 (Blob 句柄支持)
MEMORYCLERK_BITMAP 此内存 clerk 用于按 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 此内存 clerk 用于通过查询执行引擎进行 批处理模式 操作的分配

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

适用于: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 此内存 clerk 用于由 sLog (加速数据库恢复中的辅助内存中日志流) 分配

适用于:SQL Server 2019 (15.x) 及更高版本
MEMORYCLERK_SNI 此内存 clerk 为服务器网络接口 (SNI) 组件分配内存。 SNI 管理SQL Server的连接和 TDS 数据包
MEMORYCLERK_SOSMEMMANAGER 此内存 clerk 为 SQLOS (SOS 分配结构,) 线程计划和内存和 I/O 管理。
MEMORYCLERK_SOSNODE 此内存管理员为 SQLOS (SOS 分配结构,) 线程计划和内存和 I/O 管理。
MEMORYCLERK_SOSOS 此内存 clerk 为 SQLOS (SOS 分配结构,) 线程计划和内存和 I/O 管理。
MEMORYCLERK_SPATIAL 空间 数据 组件使用此内存分配器进行内存分配。
MEMORYCLERK_SQLBUFFERPOOL 此内存 clerk 跟踪通常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 SQL 引擎内的多个使用者可以使用此内存 clerk。 示例包括复制内存、内部调试/诊断、某些SQL Server启动功能、某些 SQL 分析器功能、生成系统索引、初始化全局内存对象、在服务器和链接服务器查询中创建 OLEDB 连接、服务器端探查器跟踪、创建 showplan 数据、某些安全功能、计算列编译、并行结构的内存、某些 XML 功能的内存
MEMORYCLERK_SQLHTTP 已放弃
MEMORYCLERK_SQLLOGPOOL SQL Server日志池使用此内存 clerk。 日志池是用于在读取事务日志时提高性能的缓存。 具体而言,它在多次日志读取期间提高了日志缓存利用率,减少了磁盘 I/O 日志读取并允许共享日志扫描。 日志池的主要使用者是Always On (更改捕获和发送) 、重做管理器、数据库恢复 - 分析/重做/撤消、事务运行时回滚、复制/CDC、备份/还原。
MEMORYCLERK_SQLOPTIMIZER 此内存 clerk 用于编译查询的不同阶段的内存分配。 有些用途包括查询优化、索引统计信息管理器、视图定义编译、直方图生成。
MEMORYCLERK_SQLQERESERVATIONS 此内存 clerk 用于内存授予分配,即分配给查询的内存,以便在查询执行期间执行排序和哈希操作。 有关查询执行预留 (内存授予) 的详细信息,请参阅 此博客
MEMORYCLERK_SQLQUERYCOMPILE 查询优化器使用此内存 clerk 在查询编译期间分配内存。
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 此内存存储器用于服务器端 SQL 跟踪 内存分配。
MEMORYCLERK_SQLUTILITIES 此内存 clerk 可由SQL Server内的多个分配器使用。 示例包括备份和还原、日志传送、数据库镜像、DBCC 命令、服务器端的 BCP 代码、某些查询并行工作、日志扫描缓冲区。
MEMORYCLERK_SQLXML 执行 XML 操作时,此内存职员用于内存分配。
MEMORYCLERK_SQLXP 调用 SQL Server扩展存储过程时,此内存 clerk 用于内存分配。
MEMORYCLERK_SVL 此内存职员用于分配内部 SQL OS 结构
MEMORYCLERK_TEST 仅限内部使用
MEMORYCLERK_UNITTEST 仅限内部使用
MEMORYCLERK_WRITEPAGERECORDER 此内存职员用于写入页记录器的分配。
MEMORYCLERK_XE 此内存 clerk 用于 扩展事件 内存分配
MEMORYCLERK_XE_BUFFER 此内存 clerk 用于 扩展事件 内存分配
MEMORYCLERK_XLOG_SERVER 此内存 clerk 用于SQL Azure数据库中日志文件管理的 Xlog 分配

适用于:Azure SQL 数据库
MEMORYCLERK_XTP 此内存职员用于 内存中 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 索引体系结构和设计指南

另请参阅

与 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)