sys.memory_optimized_tables_internal_attributes (Transact-SQL)

Se aplica a: SQL Server 2016 (13.x) y versiones posteriores Azure SQL DatabaseAzure SQL Managed Instance

Contiene una fila para cada tabla interna optimizada para memoria que se usa para almacenar tablas de usuario optimizadas para memoria. Cada tabla de usuario corresponde a una o varias tablas internas. Se usa solo una tabla para el almacén de datos central. Las tablas internas adicionales se usan para admitir características como almacenamiento temporal, almacenamiento de índice de almacén de columnas y almacenamiento no consecutivo (LOB) para tablas optimizadas para memoria.

Nombre de la columna Tipo de datos Descripción
object_id int Identificador de la tabla de usuario. Las tablas internas optimizadas para memoria que existen para admitir una tabla de usuario (como almacenamiento no consecutivo o filas eliminadas, en el caso de las combinaciones de Hk/almacén de columnas) tienen el mismo valor object_id como principal.
xtp_object_id bigint Identificador de objeto de OLTP en memoria que corresponde a la tabla interna optimizada para memoria que se usa para admitir la tabla de usuario. Es un identificador único dentro de la base de datos y puede cambiar a lo largo de la duración del objeto.
type int Tipo de tabla interna.

0 => DELETED_ROWS_TABLE
1 => USER_TABLE
2 => DICTIONARIES_TABLE
3 => SEGMENTS_TABLE
4 => ROW_GROUPS_INFO_TABLE
5 => TABLA DE DATOS FUERA DE FILA INTERNA
252 => INTERNAL_TEMPORAL_HISTORY_TABLE
type_desc nvarchar(60) Descripción del tipo

DELETED_ROWS_TABLE:> seguimiento interno de las filas eliminadas de un índice de almacén de columnas
USER_TABLE:> tabla que contiene los datos de usuario en fila
DICTIONARIES_TABLE:> diccionarios para un índice de almacén de columnas
SEGMENTS_TABLE:> segmentos comprimidos para un índice de almacén de columnas
ROW_GROUPS_INFO_TABLE:> metadatos sobre grupos de filas comprimidos de un índice de almacén de columnas
TABLA DE DATOS INTERNA FUERA DE FILA:> tabla interna que se usa para el almacenamiento de una columna fuera de fila. En este caso, minor_id refleja el valor de column_id.
INTERNAL_TEMPORAL_HISTORY_TABLE:> cola activa de la tabla de historial basada en disco. Las filas insertadas en el historial se insertan primero en esta tabla interna optimizada para memoria. Existe una tarea en segundo plano que mueve de forma asincrónica las filas desde esta tabla interna a la tabla de historial basada en disco.
minor_id int El valor 0 indica un usuario o una tabla interna.

Un valor distinto de 0 indica el identificador de una columna almacenada no de manera consecutiva. Se combina con column_id en sys.columns.

Cada columna que se almacena de manera no consecutiva tiene una fila correspondiente en esta vista del sistema.

Permisos

La visibilidad de los metadatos de las vistas de catálogo se limita a elementos protegibles que un usuario posee o en el que se concedió algún permiso al usuario. Para obtener más información, consulte Metadata Visibility Configuration.

Ejemplos

A Devolver todas las columnas que se almacenan de manera no consecutiva

El siguiente script T-SQL muestra una tabla con varias columnas que no son de tipo LOB y una sola columna de tipo 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

La consulta siguiente muestra todas las columnas almacenadas en filas no consecutivas, además de sus tamaños. Un tamaño de -1 indica una columna de LOB. Todas las columnas de LOB se almacenan en filas no consecutivas.

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. Devolver el consumo de memoria de todas las columnas que se almacenan de manera no consecutiva

Para más detalles sobre el consumo de memoria de las columnas que se almacenan de manera no consecutiva, puede usar la consulta siguiente que muestra el consumo de memoria de todas las tablas internas y los índices que se usan para almacenar las columnas no consecutivas:

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. Devolver el consumo de memoria de los índices de almacén de columnas en las tablas optimizadas para memoria

Use la consulta siguiente para mostrar el consumo de memoria de los índices de almacén de columnas en tablas optimizadas para memoria:

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;

Use la consulta siguiente para desglosar el consumo de memoria en las estructuras internas que se usan para los índices de almacén de columnas en tablas optimizadas para memoria:

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)