Udostępnij za pomocą


sys.dm_db_xtp_table_memory_stats (Transact-SQL)

Dotyczy:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

Zwraca statystyki zużycia pamięci dla każdej In-Memory tabeli OLTP (użytkownika i systemu) w aktualnej bazie danych. Tabele systemowe mają ujemne identyfikatory obiektów i służą do przechowywania informacji w czasie działania dla silnika OLTP In-Memory. W przeciwieństwie do obiektów użytkownika, tabele systemowe są wewnętrzne i istnieją tylko w pamięci, dlatego nie są widoczne w widokach katalogowych. Tabele systemowe służą do przechowywania informacji takich jak metadane wszystkich plików danych/delta w pamięci, żądania scalania, znaki wodne dla plików delta do filtrowania wierszy, porzucone tabele oraz istotne informacje do odzyskiwania i tworzenia kopii zapasowych. Biorąc pod uwagę, że silnik OLTP In-Memory może mieć do 8 192 par plików danych i delta, dla dużych baz danych w pamięci pamięć zajmowana przez tabele systemowe może wynosić kilka megabajtów.

Aby uzyskać więcej informacji, zobacz In-Memory OLTP (In-Memory Optimization).

Nazwa kolumny Typ danych Description
object_id int Identyfikator obiektu tabeli. NULL dla In-Memory tabel systemowych OLTP.
memory_allocated_for_table_kb bigint Pamięć przydzielona dla tej tabeli.
memory_used_by_table_kb bigint Pamięć używana przez tabelę, w tym wersje wierszowe.
memory_allocated_for_indexes_kb bigint Pamięć przydzielona na indeksy w tej tabeli.
memory_used_by_indexes_kb bigint Pamięć zużyta na indeksy w tej tabeli.

Permissions

Wszystkie wiersze są zwracane, jeśli masz uprawnienia VIEW DATABASE STATE na bieżącej bazie danych. W przeciwnym razie zwracany jest pusty zestaw wierszy.

Jeśli nie masz uprawnień VIEW DATABASE, wszystkie kolumny będą zwracane dla wierszy w tabelach, na które masz uprawnienia SELECT.

Tabele systemowe zwracane są tylko dla użytkowników z uprawnieniami VIEW DATABASE STATE.

Uprawnienia dla programu SQL Server 2022 i nowszych

Wymaga uprawnienia WYŚWIETL STAN WYDAJNOŚCI BAZY DANYCH dla bazy danych.

Przykłady

Możesz zapytać do następującego DMV, aby uzyskać przydzieloną pamięć dla tabel i indeksów w bazie danych:

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

Aby znaleźć pamięć dla wszystkich obiektów w bazie danych:

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;  

Scenariusz użytkownika

Po pierwsze, ustaw maksymalną pamięć serwera na 4GB dla zabezpieczeń. Możesz rozważyć inną wartość dla swojego środowiska.

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

Stwórz pulę zasobów dla bazy danych, która zawiera obiekty zoptymalizowane pod pamięć.

-- 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  

Powiąż pulę zasobów 'PoolHkdb1' z bazą danych 'HkDb1'. Wymaga to wyłączenia bazy danych lub połączenia online, aby powiązać pulę.

--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  

Stwórz następujące tabele w bazie danych o nazwie 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

Załaduj dane do tabeli.

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

Gdy dane są ładowane do tabeli, możesz zobaczyć tabele zdefiniowane przez użytkownika i ile miejsca są one zajmowane. Na przykład każdy wiersz tabeli może mieć około 8070 bajtów (rozmiar alokacji to 8K (8192 bajty)). Możesz zobaczyć indeksy w każdej tabeli oraz ilość miejsca na dane w tym indeksie. Na przykład 1MB to 100K wpisów zaokrąglonych do następnej potęgi 2 (2**17) = 131072 po 8 bajtów każda. Tabela może nie mieć indeksu, w takim przypadku pokaże przydział pamięci dla tego indeksu. Inne wiersze mogą reprezentować tabele systemowe

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

Oto efekt końcowy, podzielony na dwie części:

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  

Efekt wyników,

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;

jest:

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

Następnie przyjrzyjmy się wynikom z puli zasobów. Należy zauważyć, że pamięć używana z puli wynosi 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;

Dane wyjściowe:

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