sys.memory_optimized_tables_internal_attributes (Transact-SQL)

Aplica-se a: SQL Server 2016 (13.x) e posterior Banco de Dados SQL do Azure Instância Gerenciada de SQL do Azure

Contém uma linha para cada tabela com otimização de memória interna usada para armazenar as tabelas com otimização de memória do usuário. Cada tabela de usuário corresponde a uma ou mais tabelas internas. Uma única tabela é usada para o armazenamento dos principais dados. Tabelas internas adicionais são usadas para dar suporte a recursos como temporal, índice columnstore e armazenamento fora de linha (LOB) para tabelas com otimização de memória.

Nome da coluna Tipo de dados Descrição
object_id int ID da tabela de usuário. Tabelas internas com otimização de memória que existem para dar suporte a uma tabela de usuário (como armazenamento fora de linha ou linhas excluídas no caso de combinações de Hk/Columnstore) têm o mesmo object_id como pai.
xtp_object_id bigint ID de objeto OLTP in-memory correspondente à tabela interna com otimização de memória usada para dar suporte à tabela de usuário. Ela é exclusiva no banco de dados e pode mudar com o tempo de vida do objeto.
tipo int Tipo de tabela interna.

0 => DELETED_ROWS_TABLE
1 => USER_TABLE
2 => DICTIONARIES_TABLE
3 => SEGMENTS_TABLE
4 => ROW_GROUPS_INFO_TABLE
5 => TABELA DE DADOS INTERNA FORA DA LINHA
252 => INTERNAL_TEMPORAL_HISTORY_TABLE
type_desc nvarchar(60) Descrição do tipo

DELETED_ROWS_TABLE -> Tabela interna que acompanha linhas excluídas para um índice columnstore
USER_TABLE -> Tabela que contém os dados do usuário em linha
DICTIONARIES_TABLE –> Dicionários para um índice columnstore
SEGMENTS_TABLE -> Segmentos compactados para um índice columnstore
ROW_GROUPS_INFO_TABLE -> Metadados sobre grupos de linhas compactados de um índice columnstore
TABELA DE DADOS INTERNA FORA DA LINHA -> Tabela interna usada para armazenamento de uma coluna fora da linha. Nesse caso, minor_id reflete column_id.
INTERNAL_TEMPORAL_HISTORY_TABLE -> Hot tail da tabela de histórico baseada em disco. Linhas inseridas no histórico de linhas são inseridas primeiro nessa tabela interna com otimização de memória. Há uma tarefa em segundo plano que move as linhas de forma assíncrona desta tabela interna para a tabela de histórico baseada em disco.
minor_id int 0 indica um usuário ou uma tabela interna

Não 0 indica a ID de uma coluna armazenada fora de linha. Junções com column_id em sys.columns.

Cada coluna armazenada fora de linha tem uma linha correspondente nesta exibição do sistema.

Permissões

A visibilidade dos metadados em exibições do catálogo está limitada aos protegíveis que pertencem a um usuário ou para os quais o usuário recebeu permissão. Para obter mais informações, consulte Metadata Visibility Configuration.

Exemplos

R. Retornando todas as colunas armazenadas fora de linha

O seguinte script T-SQL ilustra uma tabela com várias colunas LOB não grandes e uma única coluna 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

A consulta a seguir mostra todas as colunas que são armazenadas fora da linha, juntamente com seus tamanhos. Um tamanho de -1 indica uma coluna LOB. Todas as colunas LOB são armazenadas fora de linha.

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. Retornando o consumo de memória de todas as colunas armazenados fora de linha

Para obter mais detalhes sobre o consumo de memória de colunas fora de linha, você pode usar a seguinte consulta, que mostra o consumo de memória de todas as tabelas internas e seus índices usados para armazenar as colunas fora de linha:

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. Retornando o consumo de memória de índices columnstore em tabelas com otimização de memória

Use a seguinte consulta para mostrar o consumo de memória de índices columnstore em tabelas com otimização de memória:

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 a seguinte consulta para dividir o consumo de memória em estruturas internas usadas para índices columnstore em tabelas com otimização de memória:

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)