Partilhar via


sys.memory_optimized_tables_internal_attributes (Transact-SQL)

Aplica-se a: SQL Server 2016 (13.x) e versões posteriores Azure SQL Database AzureSQL Managed InstanceSQL database in Microsoft Fabric

Contém uma linha para cada tabela interna com otimização de memória usada para armazenar 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 de dados principais. Tabelas internas adicionais são usadas para oferecer suporte a recursos como armazenamento temporal, columnstore index e off-row (LOB) para tabelas com otimização de memória.

Nome da coluna Tipo de dados Description
object_id int ID da tabela do usuário. As 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 Hk/Columnstore) têm o mesmo object_id que seu pai.
xtp_object_id bigint In-Memory ID de objeto OLTP correspondente à tabela interna com otimização de memória usada para dar suporte à tabela do usuário. Ele é exclusivo dentro do banco de dados e pode mudar ao longo da vida útil 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 DE OFF-ROW INTERNA
252 => INTERNAL_TEMPORAL_HISTORY_TABLE
descrição_tipo Nvarchar(60) Descrição do tipo

DELETED_ROWS_TABLE -> Tabela interna que controla 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 compactadas de um índice columnstore
INTERNAL OFF-ROW DATA TABLE -> Tabela interna usada para armazenamento de uma coluna fora da linha. Neste caso, minor_id reflete a column_id.
INTERNAL_TEMPORAL_HISTORY_TABLE -> Hot tail da tabela de histórico baseada em disco. As linhas inseridas no histórico são inseridas primeiro nesta tabela interna otimizada para memória. Há uma tarefa em segundo plano que move linhas de forma assíncrona dessa tabela interna para a tabela de histórico baseada em disco.
minor_id int 0 indica um usuário ou tabela interna

Não-0 indica a ID de uma coluna armazenada fora da linha. Junta-se com column_id em sys.columns.

Cada coluna armazenada fora da linha tem uma linha correspondente nesta visualização do sistema.

Permissions

A visibilidade dos metadados nas visualizações de catálogo é limitada aos itens de segurança que um utilizador possui ou nos quais o utilizador recebeu alguma permissão. Para obter mais informações, consulte Configuração de visibilidade de metadados.

Examples

A. Retornando todas as colunas armazenadas fora da linha

O seguinte script T-SQL ilustra uma tabela com várias colunas grandes não LOB 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 armazenadas fora da linha, juntamente com seus tamanhos. Um tamanho de -1 indica uma coluna LOB. Todas as colunas LOB são armazenadas fora da linha de dados principal.

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 armazenadas fora da 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 detalhar o consumo de memória entre 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)