sys.memory_optimized_tables_internal_attributes (Transact-SQL)

S’applique à : SQL Server 2016 (13.x) et versions ultérieures Azure SQL DatabaseAzure SQL Managed Instance

Contient une ligne pour chaque table optimisée en mémoire interne utilisé pour stocker les tables utilisateur optimisées en mémoire. Chaque table utilisateur correspond à une ou plusieurs tables internes. Une seule table est utilisée pour le stockage de données principal. Les tables internes supplémentaires servent à la prise en charge des fonctionnalités telles que les index columnstore temporels et le stockage (LOB) hors ligne des tables optimisées en mémoire.

Nom de la colonne Type de données Description
object_id int Identifiant de la table utilisateur. Les tables optimisées en mémoire internes destinées à la prise en charge d’une table utilisateur (par exemple, le stockage hors ligne ou les lignes supprimées dans le cas de combinaisons Hk/Columnstore) ont le même object_id que leurs parents.
xtp_object_id bigint ID de l’objet In-Memory OLTP correspondant à la table optimisée en mémoire interne utilisée pour prendre en charge la table utilisateur. Il est unique dans la base de données, et peut évoluer au fil de la durée de vie de l’objet.
type int Type de la table interne.

0 => DELETED_ROWS_TABLE
1 => USER_TABLE
2 => DICTIONARIES_TABLE
3 => SEGMENTS_TABLE
4 => ROW_GROUPS_INFO_TABLE
5 => TABLE DE DONNÉES HORS LIGNE INTERNE
252 => INTERNAL_TEMPORAL_HISTORY_TABLE
type_desc nvarchar(60) Description du type

DELETED_ROWS_TABLE -> Suivi interne des lignes supprimées de table pour un index columnstore
USER_TABLE -> Table contenant les données utilisateur en ligne
DICTIONARIES_TABLE -> Dictionnaires pour un index columnstore
SEGMENTS_TABLE -> Segments compressés pour un index columnstore
ROW_GROUPS_INFO_TABLE -> Métadonnées sur les groupes de lignes compressés d’un index columnstore
INTERNAL OFF-ROW DATA TABLE -> Table interne utilisée pour le stockage d’une colonne hors ligne. Dans ce cas, minor_id reflète column_id.
INTERNAL_TEMPORAL_HISTORY_TABLE -> Fin à chaud de la table d’historique sur disque. Tout d’abord, les lignes insérées dans l’historique sont insérées dans cette table optimisée en mémoire interne. Il existe une tâche en arrière-plan qui déplace de manière asynchrone les lignes de cette table interne vers la table d’historique sur disque.
minor_id int 0 indique une table utilisateur ou interne

Non-0 indique l’ID d’une colonne stockée hors ligne. Se joint à column_id dans sys.columns.

Chaque colonne stockée hors ligne a une ligne correspondante dans cette vue système.

Autorisations

La visibilité des métadonnées dans les affichages catalogue est limitée aux éléments sécurisables qu’un utilisateur possède ou sur lesquels l’utilisateur a reçu une autorisation. Pour plus d'informations, consultez Metadata Visibility Configuration.

Exemples

R. Renvoi de toutes les colonnes qui sont stockées hors ligne

Le script T-SQL suivant illustre une table avec plusieurs grandes colonnes non-LOB et une seule colonne 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 requête suivante affiche toutes les colonnes qui sont stockées hors ligne, ainsi que leur taille. Une taille de -1 indique une colonne LOB. Toutes les colonnes LOB sont stockées hors ligne.

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. Retour de la consommation de mémoire de toutes les colonnes qui sont stockées hors ligne

Pour obtenir plus d’informations sur la consommation de mémoire des colonnes hors ligne, vous pouvez utiliser la requête suivante, qui montre la consommation de mémoire de toutes les tables internes et de leurs index utilisés pour stocker les colonnes hors ligne :

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. Retour de la consommation de mémoire des index columnstore sur les tables optimisées en mémoire

Utilisez la requête suivante pour afficher la consommation de mémoire des index columnstore sur les tables optimisées en mémoire :

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;

Utilisez la requête suivante pour décomposer la consommation de mémoire entre les structures internes utilisées pour les index columnstore sur les tables optimisées en mémoire :

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)