sys.memory_optimized_tables_internal_attributes (T-SQL)

Berlaku untuk: SQL Server 2016 (13.x) dan Azure SQL DatabaseAzure SQL Managed Instance yang lebih baru

Berisi baris untuk setiap tabel internal yang dioptimalkan memori yang digunakan untuk menyimpan tabel yang dioptimalkan memori pengguna. Setiap tabel pengguna sesuai dengan satu atau beberapa tabel internal. Satu tabel digunakan untuk penyimpanan data inti. Tabel internal tambahan digunakan untuk mendukung fitur seperti penyimpanan temporal, indeks penyimpan kolom, dan penyimpanan off-row (LOB) untuk tabel yang dioptimalkan memori.

Nama kolom Jenis data Deskripsi
object_id int ID tabel pengguna. Tabel internal yang dioptimalkan memori yang ada untuk mendukung tabel pengguna (seperti penyimpanan di luar baris atau baris yang dihapus jika terjadi kombinasi Hk/Columnstore) memiliki object_id yang sama dengan induknya.
xtp_object_id bigint ID objek OLTP Dalam Memori yang sesuai dengan tabel internal yang dioptimalkan memori yang digunakan untuk mendukung tabel pengguna. Ini unik dalam database dan dapat berubah selama masa pakai objek.
jenis int Jenis tabel internal.

0 => DELETED_ROWS_TABLE
1 => USER_TABLE
2 => DICTIONARIES_TABLE
3 => SEGMENTS_TABLE
4 => ROW_GROUPS_INFO_TABLE
5 => TABEL DATA INTERNAL DI LUAR BARIS
252 => INTERNAL_TEMPORAL_HISTORY_TABLE
type_desc nvarchar(60) Deskripsi jenis

DELETED_ROWS_TABLE -> Pelacakan tabel internal baris yang dihapus untuk indeks penyimpan kolom
USER_TABLE -> Tabel yang berisi data pengguna dalam baris
DICTIONARIES_TABLE -> Kamus untuk indeks penyimpan kolom
SEGMENTS_TABLE -> Segmen terkompresi untuk indeks penyimpan kolom
ROW_GROUPS_INFO_TABLE -> Metadata tentang grup baris terkompresi dari indeks penyimpan kolom
TABEL DATA INTERNAL OFF-ROW -> Tabel internal yang digunakan untuk penyimpanan kolom di luar baris. Dalam hal ini, minor_id mencerminkan column_id.
INTERNAL_TEMPORAL_HISTORY_TABLE -> Ekor panas tabel riwayat berbasis disk. Baris yang disisipkan ke dalam riwayat dimasukkan ke dalam tabel internal yang dioptimalkan memori ini terlebih dahulu. Ada tugas latar belakang yang secara asinkron memindahkan baris dari tabel internal ini ke tabel riwayat berbasis disk.
minor_id int 0 menunjukkan pengguna atau tabel internal

Non-0 menunjukkan ID kolom yang disimpan di luar baris. Bergabung dengan column_id di sys.columns.

Setiap kolom yang disimpan di luar baris memiliki baris yang sesuai dalam tampilan sistem ini.

Izin

Visibilitas metadata dalam tampilan katalog terbatas pada keamanan yang dimiliki pengguna, atau di mana pengguna diberikan beberapa izin. Untuk informasi selengkapnya, lihat Konfigurasi Visibilitas Metadata.

Contoh

J. Mengembalikan semua kolom yang disimpan di luar baris

Skrip T-SQL berikut mengilustrasikan tabel dengan beberapa kolom non-LOB besar dan satu kolom 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

Kueri berikut ini memperlihatkan semua kolom yang disimpan di luar baris, bersama dengan ukurannya. Ukuran -1 menunjukkan kolom LOB. Semua kolom LOB disimpan di luar baris.

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. Mengembalikan konsumsi memori semua kolom yang disimpan di luar baris

Untuk mendapatkan detail selengkapnya tentang konsumsi memori kolom di luar baris, Anda bisa menggunakan kueri berikut, yang memperlihatkan konsumsi memori semua tabel internal dan indeksnya yang digunakan untuk menyimpan kolom di luar baris:

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. Mengembalikan konsumsi memori indeks penyimpan kolom pada tabel yang dioptimalkan memori

Gunakan kueri berikut untuk memperlihatkan konsumsi memori indeks penyimpan kolom pada tabel yang dioptimalkan memori:

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;

Gunakan kueri berikut memecah konsumsi memori di seluruh struktur internal yang digunakan untuk indeks penyimpan kolom pada tabel yang dioptimalkan memori:

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)