sys.memory_optimized_tables_internal_attributes (Transact-SQL)

Область применения: SQL Server 2016 (13.x) и более поздних версий База данных SQL Azure Управляемый экземпляр SQL Azure

Содержит строку для каждой внутренней оптимизированной для памяти таблицы, которая используются для хранения пользовательских таблиц, оптимизированных для памяти. Каждая пользовательская таблица соответствует одной или нескольким внутренним таблицам. Одна таблица используется для хранения основных данных. Дополнительные внутренние таблицы используются для поддержки таких функций, как темпоральные таблицы, индекс columnstore и хранилище (LOB) "вне строки" для таблиц, оптимизированных для памяти.

Имя столбца Тип данных Description
object_id int Идентификатор пользовательской таблицы. Внутренние оптимизированные для памяти таблицы, служащие для поддержки пользовательской таблицы (например, хранилища вне строки или удаленных строк в случае сочетания Hk/Columnstore), имеют то же значение object_id, что и их родительский объект.
xtp_object_id bigint Идентификатор объекта выполняющейся в памяти OLTP, который соответствует внутренней оптимизированной для памяти таблице, используемой для поддержки пользовательской таблицы. Он уникален в пределах базы данных и может изменяться за время существования объекта.
type int Тип внутренней таблицы.

0 => DELETED_ROWS_TABLE
1 => USER_TABLE
2 => DICTIONARIES_TABLE
3 => SEGMENTS_TABLE
4 => ROW_GROUPS_INFO_TABLE
5 => ВНУТРЕННЯЯ ТАБЛИЦА ДАННЫХ OFF-ROW
252 => INTERNAL_TEMPORAL_HISTORY_TABLE
type_desc nvarchar(60) Описание типа

DELETED_ROWS_TABLE .> Внутренняя отслеживание таблиц, отслеживаемая удаленные строки для индекса columnstore
USER_TABLE .> Таблица, содержащая данные пользователя в строке
DICTIONARIES_TABLE —> словари для индекса columnstore
SEGMENTS_TABLE —> сжатые сегменты для индекса columnstore
ROW_GROUPS_INFO_TABLE —> метаданные о сжатых группах строк индекса columnstore
ВНУТРЕННЯЯ ТАБЛИЦА ДАННЫХ OFF-ROW —> внутренняя таблица, используемая для хранения столбца вне строки. В данном случае minor_id отражает столбец column_id.
INTERNAL_TEMPORAL_HISTORY_TABLE —> горячий хвост таблицы журнала на основе диска. Вставляемые в журнал строки сначала вставляются во внутреннюю таблицу, оптимизированную для памяти. Существует фоновая задача, которая асинхронно перемещает строки из этой внутренней таблицы в таблицу журнала на диске.
minor_id int Значение 0 указывает на пользователя или внутреннюю таблицу

Ненулевое значение обозначает идентификатор столбца, хранящегося вне строки. Соединяется с column_id в sys.columns.

Каждый столбец, хранящийся вне строки, имеет соответствующую строку в этом системном представлении.

Разрешения

Видимость метаданных в представлениях каталога ограничена защищаемыми объектами, которыми владеет пользователь или которым пользователь получил некоторое разрешение. Дополнительные сведения см. в разделе Metadata Visibility Configuration.

Примеры

А. Возвращение всех столбцов, которые хранятся вне строки

В следующем скрипте 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. Возвращение сведений о потреблении памяти для индексов columnstore в таблицах, оптимизированных для памяти

Используйте следующий запрос, чтобы показать потребление памяти индексов columnstore в таблицах, оптимизированных для памяти:

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;

Используйте следующий запрос разбиения потребления памяти во внутренних структурах, используемых для индексов columnstore в таблицах, оптимизированных для памяти:

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)