sys.memory_optimized_tables_internal_attributes (Transact-SQL)

适用于: SQL Server 2016 (13.x) 及更高版本 Azure SQL 数据库Azure SQL 托管实例

对于用于存储用户内存优化表的每个内部内存优化表都包含一行。 每个用户表与一个或多个内部表对应。 单个表用于核心数据存储。 其他内部表用于支持功能,如用于内存优化表的临时、列存储索引和行外 (LOB) 存储。

列名称 数据类型 说明
object_id int 用户表的 ID。 为支持用户表(如针对 Hk/列存储组合情况的行外存储或已删除行)而存在的内部内存优化表将相同 object_id 作为其父级。
xtp_object_id bigint 与用于支持用户表的内部内存优化表对应的内存中 OLTP 对象 ID。 它在数据库中是唯一的,可以在对象的生存期内更改。
type int 内部表的类型。

0 => DELETED_ROWS_TABLE
1 => U标准版R_TABLE
2 => DICTIONARIES_TABLE
3 => 标准版GMENTS_TABLE
4 => ROW_GROUPS_INFO_TABLE
5 => 内部非行数据表
252 => INTERNAL_TEMPORAL_HISTORY_TABLE
type_desc nvarchar(60) 类型的说明

DELETED_ROWS_TABLE -> 列存储索引的内部表跟踪已删除行
U标准版R_TABLE -> 包含行内用户数据的表
DICTIONARIES_TABLE -> 列存储索引的字典
标准版GMENTS_TABLE ->列存储索引的压缩段
ROW_GROUPS_INFO_TABLE -> 有关列存储索引的压缩行组的元数据
内部 OFF-ROW DATA TABLE -> 用于存储行外列的内部表。 在这种情况下,minor_id 反映 column_id。
INTERNAL_TEMPORAL_HISTORY_TABLE -> 基于磁盘的历史记录表的热尾。 插入历史记录中的行会先插入此内部内存优化表中。 有一个后台任务以异步方式将行从此内部表移动到基于磁盘的历史记录表。
minor_id int 0 指示用户或内部表

非 0 指示行外存储的列的 ID。 在 sys.columns 中与 column_id 联接。

每个行外存储的列都在此系统视图中具有对应行。

权限

目录视图中元数据的可见性仅限于用户拥有的安全对象,或者向用户授予了某些权限的安全对象。 有关详细信息,请参阅 Metadata Visibility Configuration

示例

A. 返回行外存储的所有列

以下 T-SQL 脚本演示一个表,包含多个非 LOB 大型列和单个 LOB 列:

CREATE TABLE dbo.LargeTableSample
(
      Id   int IDENTITY PRIMARY KEY NONCLUSTERED,
      C1   nvarchar(4000),
      C2   nvarchar(4000),
      C3   nvarchar(4000),
      C4   nvarchar(4000),
      Misc nvarchar(max)
) WITH (MEMORY_OPTIMIZED = ON);
GO

以下查询显示了存储在行外的所有列及其大小。 大小 -1 表示 LOB 列。 所有 LOB 列存储在行外。

SELECT 
  QUOTENAME(SCHEMA_NAME(o.schema_id)) + N'.' + QUOTENAME(OBJECT_NAME(moa.object_id)) AS 'table', 
  c.name AS 'column', 
  c.max_length
FROM sys.memory_optimized_tables_internal_attributes moa
     JOIN sys.columns c ON moa.object_id = c.object_id AND moa.minor_id=c.column_id
     JOIN sys.objects o on moa.object_id=o.object_id 
WHERE moa.type=5;

B. 返回行外存储的所有列的内存占用情况

要获取受管行外列的内存占用情况的详细信息,可以使用以下查询,它显示用于存储行外列的所有内部表及其索引的内存占用情况:

SELECT
  QUOTENAME(SCHEMA_NAME(o.schema_id)) + N'.' + QUOTENAME(OBJECT_NAME(moa.object_id)) AS 'table',
  c.name AS 'column',
  c.max_length,
  mc.memory_consumer_desc,
  mc.index_id,
  mc.allocated_bytes,
  mc.used_bytes
FROM sys.memory_optimized_tables_internal_attributes moa
   JOIN sys.columns c ON moa.object_id = c.object_id AND moa.minor_id=c.column_id
   JOIN sys.dm_db_xtp_memory_consumers mc ON moa.xtp_object_id=mc.xtp_object_id
   JOIN sys.objects o on moa.object_id=o.object_id 
WHERE moa.type=5;

°C 返回内存优化表上的列存储索引的内存占用情况

使用以下查询显示内存优化表中列存储索引的内存消耗:

SELECT
  QUOTENAME(SCHEMA_NAME(o.schema_id)) + N'.' + QUOTENAME(OBJECT_NAME(moa.object_id)) AS 'table',
  i.name AS 'columnstore index',
  SUM(mc.allocated_bytes) / 1024 as [allocated_kb],
  SUM(mc.used_bytes) / 1024 as [used_kb]
FROM sys.memory_optimized_tables_internal_attributes moa
   JOIN sys.indexes i ON moa.object_id = i.object_id AND i.type in (5,6)
   JOIN sys.dm_db_xtp_memory_consumers mc ON moa.xtp_object_id=mc.xtp_object_id
   JOIN sys.objects o on moa.object_id=o.object_id
WHERE moa.type IN (0, 2, 3, 4)
GROUP BY o.schema_id, moa.object_id, i.name;

使用以下查询可细分用于内存优化表上的列存储索引的内部结构的内存消耗:

SELECT
  QUOTENAME(SCHEMA_NAME(o.schema_id)) + N'.' + QUOTENAME(OBJECT_NAME(moa.object_id)) AS 'table',
  i.name AS 'columnstore index',
  moa.type_desc AS 'internal table',
  mc.index_id AS 'index',
  mc.memory_consumer_desc,
  mc.allocated_bytes / 1024 as [allocated_kb],
  mc.used_bytes / 1024 as [used_kb]
FROM sys.memory_optimized_tables_internal_attributes moa
   JOIN sys.indexes i ON moa.object_id = i.object_id AND i.type in (5,6)
   JOIN sys.dm_db_xtp_memory_consumers mc ON moa.xtp_object_id=mc.xtp_object_id
   JOIN sys.objects o on moa.object_id=o.object_id
WHERE moa.type IN (0, 2, 3, 4)