sys.dm_db_xtp_table_memory_stats (T-SQL)

Berlaku untuk:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

Mengembalikan statistik penggunaan memori untuk setiap tabel OLTP Dalam Memori (pengguna dan sistem) dalam database saat ini. Tabel sistem memiliki ID objek negatif dan digunakan untuk menyimpan informasi run-time untuk mesin OLTP Dalam Memori. Tidak seperti objek pengguna, tabel sistem bersifat internal dan hanya ada dalam memori, oleh karena itu, tabel tersebut tidak terlihat melalui tampilan katalog. Tabel sistem digunakan untuk menyimpan informasi seperti metadata untuk semua file data/delta dalam penyimpanan, permintaan penggabungan, marka air untuk file delta untuk memfilter baris, tabel yang dihilangkan, dan informasi yang relevan untuk pemulihan dan pencadangan. Mengingat bahwa mesin OLTP Dalam Memori dapat memiliki hingga 8.192 pasangan data dan file delta, untuk database dalam memori besar, memori yang diambil oleh tabel sistem bisa beberapa megabyte.

Untuk informasi selengkapnya, lihat OLTP Dalam Memori (Pengoptimalan Dalam Memori).

Nama kolom Jenis data Deskripsi
object_id int ID objek tabel. NULL untuk tabel sistem OLTP Dalam Memori.
memory_allocated_for_table_kb bigint Memori yang dialokasikan untuk tabel ini.
memory_used_by_table_kb bigint Memori yang digunakan oleh tabel, termasuk versi baris.
memory_allocated_for_indexes_kb bigint Memori yang dialokasikan untuk indeks pada tabel ini.
memory_used_by_indexes_kb bigint Memori yang digunakan untuk indeks pada tabel ini.

Izin

Semua baris dikembalikan jika Anda memiliki izin TAMPILKAN STATUS DATABASE pada database saat ini. Jika tidak, kumpulan baris kosong dikembalikan.

Jika Anda tidak memiliki izin LIHAT DATABASE, semua kolom akan dikembalikan untuk baris dalam tabel tempat Anda memiliki izin SELECT.

Tabel sistem dikembalikan hanya untuk pengguna dengan izin TAMPILKAN STATUS DATABASE.

Izin untuk SQL Server 2022 dan yang lebih baru

Memerlukan izin TAMPILKAN STATUS PERFORMA DATABASE pada database.

Contoh

Anda bisa mengkueri DMV berikut untuk mendapatkan memori yang dialokasikan untuk tabel dan indeks dalam database:

-- finding memory for objects  
SELECT OBJECT_NAME(object_id), *   
FROM sys.dm_db_xtp_table_memory_stats;  

Untuk menemukan memori untuk semua objek dalam database:

SELECT SUM( memory_allocated_for_indexes_kb + memory_allocated_for_table_kb) AS  
 memoryallocated_objects_in_kb   
FROM sys.dm_db_xtp_table_memory_stats;  

Skenario Pengguna

Pertama, atur memori server maks ke 4GB sebagai ukuran keamanan. Anda mungkin ingin mempertimbangkan nilai yang berbeda untuk lingkungan Anda.

-- set max server memory to 4 GB  
EXEC sp_configure 'max server memory (MB)', 4048  
go  
  
RECONFIGURE  
go  

Buat kumpulan sumber daya untuk database yang berisi objek yang dioptimalkan memori.

-- create a resource pool for the database with memory-optimized objects  
CREATE RESOURCE POOL PoolHkDb1 WITH (MAX_MEMORY_PERCENT = 50);  
ALTER RESOURCE GOVERNOR RECONFIGURE;  
go  

Ikat kumpulan sumber daya 'PoolHkdb1' ke database 'HkDb1'. Ini mengharuskan mengambil database offline/online untuk mengaitkan kumpulan.

--bind the pool to the database  
EXEC sp_xtp_bind_db_resource_pool 'HkDb1', 'PoolHkdb1'  
go  
  
-- take database offline/online to associate the pool  
use master  
go  
  
alter database HkDb1 set offline  
go  
alter database HkDb1 set online  
go  

Buat tabel berikut dalam database yang disebut HkDb1.

USE HkDb1  
GO
  
CREATE TABLE dbo.t1 (  
       c1 int NOT NULL,  
       c2 char(40) NOT NULL,  
       c3 char(8000) NOT NULL,  
  
       CONSTRAINT [pk_t1_c1] PRIMARY KEY NONCLUSTERED HASH (c1) WITH (BUCKET_COUNT = 100000)  
) WITH (MEMORY_OPTIMIZED = ON, DURABILITY = SCHEMA_AND_DATA);
GO
  
CREATE TABLE dbo.t2 (  
       c1 int NOT NULL,  
       c2 char(40) NOT NULL,  
       c3 char(8000) NOT NULL,  
  
       CONSTRAINT [pk_t2_c1] PRIMARY KEY NONCLUSTERED HASH (c1) WITH (BUCKET_COUNT = 100000)  
) WITH (MEMORY_OPTIMIZED = ON, DURABILITY = SCHEMA_AND_DATA);
GO  
  
CREATE TABLE dbo.t3 (  
       c1 int NOT NULL,  
       c2 char(40) NOT NULL,  
       c3 char(8000) NOT NULL,  
  
       CONSTRAINT [pk_t3_c1] PRIMARY KEY NONCLUSTERED HASH (c1) WITH (BUCKET_COUNT = 1000000)  
) WITH (MEMORY_OPTIMIZED = ON, DURABILITY = SCHEMA_AND_DATA)  
GO

Muat data ke dalam tabel.

-- load 150K rows  
DECLARE @i int = 0  
WHILE (@i <= 150000)  
BEGIN  
       insert t1 values (@i, 'a', replicate ('b', 8000))  
       set @i += 1;  
END  
GO  

Saat data dimuat ke dalam tabel, Anda dapat melihat tabel yang ditentukan pengguna dan berapa banyak penyimpanan yang digunakannya. Misalnya, setiap baris tabel bisa sekitar 8070 byte (ukuran alokasi adalah 8K (8192 byte)). Anda dapat melihat indeks per tabel dan berapa banyak penyimpanan yang digunakan indeks. Misalnya, 1MB adalah entri 100K yang dibulatkan ke kekuatan berikutnya 2 (2**17) = 131072 masing-masing 8 byte. Tabel mungkin tidak memiliki indeks, dalam hal ini akan menampilkan alokasi memori untuk indeks. Baris lain dapat mewakili tabel sistem

select convert(char(10), object_name(object_id)) as Name,*   
from sys.dm_db_xtp_table_memory_stats;

Berikut adalah outputnya, dalam dua bagian:

Name       object_id   memory_allocated_for_table_kb memory_used_by_table_kb  
---------- ----------- ----------------------------- -----------------------  
t3         629577281   0                             0  
t1         565577053   1372928                       1202351  
t2         597577167   0                             0  
NULL       -6          0                             0  
NULL       -5          0                             0  
NULL       -4          0                             0  
NULL       -3          0                             0  
NULL       -2          192                           25  
  
memory_allocated_for_indexes_kb memory_used_by_indexes_kb  
------------------------------- -------------------------  
8192                            8192  
1024                            1024  
8192                            8192  
2                               2  
24                              24  
2                               2  
2                               2  
16                              16  

Output dari,

select  sum(allocated_bytes)/(1024*1024) as total_allocated_MB,   
       sum(used_bytes)/(1024*1024) as total_used_MB  
from sys.dm_db_xtp_memory_consumers;

adalah:

total_allocated_MB   total_used_MB  
-------------------- --------------------  
1357                 1191  

Selanjutnya, mari kita lihat output dari kumpulan sumber daya. Perhatikan bahwa memori yang digunakan dari kumpulan adalah 1356 MB.

select pool_id,convert(char(10), name) as Name, min_memory_percent, max_memory_percent,   
   max_memory_kb/1024 as max_memory_mb  
from sys.dm_resource_governor_resource_pools; 
  
select used_memory_kb/1024 as used_memory_mb ,target_memory_kb/1024 as target_memory_mb  
from sys.dm_resource_governor_resource_pools;

Outputnya:

pool_id     Name       min_memory_percent max_memory_percent max_memory_mb  
----------- ---------- ------------------ ------------------ --------------------  
1           internal   0                  100                3845  
2           default    0                  100                3845  
259         PoolHkDb1  0                  100                3845  
  
used_memory_mb       target_memory_mb  
-------------------- --------------------  
125                  3845  
32                   3845  
1356                 3845