Sdílet prostřednictvím


sys.memory_optimized_tables_internal_attributes (Transact-SQL)

Platí na: SQL Server 2016 (13.x) a novější verze Azure SQL DatabaseAzure SQL Managed InstanceSQL database in Microsoft Fabric

Obsahuje řádek pro každou interní tabulku optimalizovanou pro paměť, která se používá k ukládání tabulek optimalizovaných pro uživatele. Každá tabulka uživatelů odpovídá jedné nebo více interním tabulkám. Jedna tabulka se používá pro základní úložiště dat. Další interní tabulky se používají k podpoře funkcí, jako jsou dočasné, index columnstore a úložiště mimo řádek (LOB) pro tabulky optimalizované pro paměť.

Název sloupce Datový typ Description
object_id int ID tabulky uživatele Interní tabulky optimalizované pro paměť, které existují, aby podporovaly uživatelskou tabulku (například úložiště mimo řádky nebo odstraněné řádky v případě kombinací Hk/Columnstore), mají stejné object_id jako jejich nadřazený objekt.
xtp_object_id bigint In-Memory ID objektu OLTP odpovídající interní tabulce optimalizované pro paměť, která se používá k podpoře tabulky uživatele. Je jedinečný v rámci databáze a může se v průběhu životnosti objektu změnit.
typ int Typ interní tabulky.

0 => DELETED_ROWS_TABLE
1 => USER_TABLE
2 => DICTIONARIES_TABLE
3 => SEGMENTS_TABLE
4 => ROW_GROUPS_INFO_TABLE
5 => INTERNÍ OFF-ROW TABULKA DAT
252 => INTERNAL_TEMPORAL_HISTORY_TABLE
type_desc nvarchar(60) Popis typu

DELETED_ROWS_TABLE –> interní tabulka sledující odstraněné řádky pro index columnstore
USER_TABLE –> tabulka obsahující uživatelská data v řádku
DICTIONARIES_TABLE –> Slovníky pro index columnstore
SEGMENTS_TABLE –> komprimované segmenty indexu columnstore
ROW_GROUPS_INFO_TABLE –> metadata o komprimovaných skupinách řádků indexu columnstore
INTERNÍ OFF-ROW TABULKA DAT –> interní tabulka použitá pro ukládání sloupce mimo řádek. V tomto případě minor_id odráží column_id.
INTERNAL_TEMPORAL_HISTORY_TABLE –> hot tail of the disk-based history table. Řádky vložené do historie se nejprve vloží do této interní tabulky optimalizované pro paměť. Existuje úloha na pozadí, která asynchronně přesouvá řádky z této interní tabulky do tabulky historie založené na disku.
minor_id int 0 označuje uživatele nebo interní tabulku.

Ne-0 označuje ID sloupce uloženého mimo řádek. Spojí se s column_id ve sloupcích sys.columns.

Každý sloupec uložený mimo řádek má v tomto zobrazení systému odpovídající řádek.

Povolení

Viditelnost metadat v zobrazeních katalogu je omezena na položky, které uživatel vlastní, nebo na které má uživatel udělené určité oprávnění. Další informace naleznete v kapitole Konfigurace viditelnosti metadat.

Examples

A. Vrácení všech sloupců uložených mimo řádek

Následující skript T-SQL znázorňuje tabulku s několika velkými sloupci, které nejsou lob, a jedním sloupcem 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

Následující dotaz zobrazuje všechny sloupce, které jsou uložené mimo řádek spolu s jejich velikostmi. Velikost -1 označuje sloupec LOB. Všechny obchodní sloupce se ukládají mimo řádek.

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. Vrácení spotřeby paměti všech sloupců uložených mimo řádek

Pokud chcete získat další podrobnosti o spotřebě paměti sloupců mimo řádek, můžete použít následující dotaz, který zobrazuje spotřebu paměti všech interních tabulek a jejich indexů, které se používají k ukládání sloupců mimo řádek:

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. Vrácení spotřeby paměti indexů columnstore v tabulkách optimalizovaných pro paměť

Pomocí následujícího dotazu zobrazte spotřebu paměti indexů columnstore v tabulkách optimalizovaných pro paměť:

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;

Pomocí následujícího dotazu rozdělte spotřebu paměti napříč interními strukturami používanými pro indexy columnstore v tabulkách optimalizovaných pro paměť:

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)