Udostępnij za pomocą


sys.memory_optimized_tables_internal_attributes (Transact-SQL)

Dotyczy do: SQL Server 2016 (13.x) i nowsze wersje Azure SQL DatabaseAzure SQL Managed InstanceSQL database in Microsoft Fabric

Zawiera wiersz dla każdej tabeli zoptymalizowanej pod kątem pamięci wewnętrznej używanej do przechowywania tabel zoptymalizowanych pod kątem pamięci użytkownika. Każda tabela użytkownika odpowiada co najmniej jednej tabeli wewnętrznej. Pojedyncza tabela jest używana na potrzeby podstawowego magazynu danych. Dodatkowe tabele wewnętrzne są używane do obsługi funkcji, takich jak czasowe, indeks magazynu kolumn i magazyn poza wierszem (LOB) dla tabel zoptymalizowanych pod kątem pamięci.

Nazwa kolumny Typ danych Description
object_id int Identyfikator tabeli użytkownika. Wewnętrzne tabele zoptymalizowane pod kątem pamięci, które istnieją w celu obsługi tabeli użytkownika (np. magazynu poza wierszami lub usuniętych wierszy w przypadku kombinacji Hk/Columnstore) mają te same object_id co ich nadrzędne.
xtp_object_id bigint In-Memory identyfikator obiektu OLTP odpowiadający wewnętrznej tabeli zoptymalizowanej pod kątem pamięci używanej do obsługi tabeli użytkowników. Jest ona unikatowa w bazie danych i może ulec zmianie w okresie istnienia obiektu.
typ int Typ tabeli wewnętrznej.

0 => DELETED_ROWS_TABLE
1 => USER_TABLE
2 => DICTIONARIES_TABLE
3 => SEGMENTS_TABLE
4 => ROW_GROUPS_INFO_TABLE
5 => WEWNĘTRZNA TABELA DANYCH OFF-ROW
252 => INTERNAL_TEMPORAL_HISTORY_TABLE
type_desc nvarchar(60) Opis typu

DELETED_ROWS_TABLE —> wewnętrzne śledzenie usuniętych wierszy tabeli dla indeksu magazynu kolumn
USER_TABLE —> tabela zawierająca dane użytkownika w wierszu
DICTIONARIES_TABLE —> słowniki dla indeksu magazynu kolumn
SEGMENTS_TABLE —> skompresowane segmenty dla indeksu magazynu kolumn
ROW_GROUPS_INFO_TABLE —> metadane dotyczące skompresowanych grup wierszy indeksu magazynu kolumn
INTERNAL OFF-ROW DATA TABLE —> wewnętrzna tabela używana do przechowywania kolumny poza wierszem. W tym przypadku minor_id odzwierciedla column_id.
INTERNAL_TEMPORAL_HISTORY_TABLE —> gorąca część tabeli historii opartej na dysku. Wiersze wstawione do historii są najpierw wstawiane do tej wewnętrznej tabeli zoptymalizowanej pod kątem pamięci. Istnieje zadanie w tle, które asynchronicznie przenosi wiersze z tej tabeli wewnętrznej do tabeli historii opartej na dysku.
minor_id int 0 wskazuje użytkownika lub tabelę wewnętrzną

Wartość innej niż 0 wskazuje identyfikator kolumny przechowywanej poza wierszem. Sprzężenia z column_id w pliku sys.columns.

Każda kolumna przechowywana poza wierszem ma odpowiedni wiersz w tym widoku systemowym.

Permissions

Widoczność metadanych w widokach katalogu jest ograniczona do obiektów, których właścicielem jest użytkownik lub w stosunku do których użytkownik ma jakieś uprawnienia. Aby uzyskać więcej informacji, zobacz Konfiguracja widoczności metadanych.

Przykłady

A. Zwracanie wszystkich kolumn przechowywanych poza wierszem

Poniższy skrypt języka T-SQL ilustruje tabelę z wieloma dużymi kolumnami innych niż LOB i jedną kolumną 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

Poniższe zapytanie przedstawia wszystkie kolumny przechowywane poza wierszem wraz z ich rozmiarami. Rozmiar -1 wskazuje kolumnę LOB. Wszystkie kolumny LOB są przechowywane w osobnej lokalizacji.

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. Zwracanie zużycia pamięci wszystkich kolumn przechowywanych poza wierszem

Aby uzyskać więcej szczegółów na temat zużycia pamięci w kolumnach poza wierszem, można użyć następującego zapytania, które pokazuje zużycie pamięci wszystkich tabel wewnętrznych i ich indeksów używanych do przechowywania kolumn poza wierszem:

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. Zwracanie użycia pamięci indeksów magazynu kolumn w tabelach zoptymalizowanych pod kątem pamięci

Użyj następującego zapytania, aby wyświetlić użycie pamięci indeksów magazynu kolumn w tabelach zoptymalizowanych pod kątem pamięci:

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;

Użyj następującego zapytania, aby podzielić użycie pamięci między strukturami wewnętrznymi używanymi dla indeksów magazynu kolumn w tabelach zoptymalizowanych pod kątem pamięci:

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)