sys.dm_db_xtp_table_memory_stats (Transact-SQL)

Gilt für:SQL ServerAzure SQL-DatenbankAzure SQL Managed Instance

Gibt Speicherauslastungsstatistiken für jede OLTP-Tabelle im Arbeitsspeicher (Benutzer und System) in der aktuellen Datenbank zurück. Die Systemtabellen weisen negative Objekt-IDs auf und werden verwendet, um Laufzeitinformationen für das OLTP-Modul im Arbeitsspeicher zu speichern. Im Gegensatz zu Benutzerobjekten sind Systemtabellen intern und nur im Arbeitsspeicher vorhanden. Daher werden sie in Katalogsichten nicht aufgeführt. Systemtabellen werden verwendet, um Informationen wie Metadaten für alle Daten/Delta-Dateien im Speicher, Zusammenführungsanforderungen, Wasserzeichen für Delta-Dateien zu speichern, um Zeilen zu filtern, verworfene Tabellen und relevante Informationen für Wiederherstellung und Sicherungen zu filtern. Da das OLTP-Modul im Arbeitsspeicher bis zu 8.192 Daten- und Delta-Dateipaare aufweisen kann, können bei großen In-Memory-Datenbanken der Von Systemtabellen eingenommene Arbeitsspeicher einige Megabytes sein.

Weitere Informationen finden Sie unter In-Memory OLTP (Speicheroptimierung).

Spaltenname Datentyp BESCHREIBUNG
object_id int Die Objekt-ID der Tabelle. NULL für OLTP-Systemtabellen im Arbeitsspeicher.
memory_allocated_for_table_kb bigint Für diese Tabelle zugeordneter Arbeitsspeicher.
memory_used_by_table_kb bigint Von der Tabelle verwendeter Arbeitsspeicher einschließlich Zeilenversionen.
memory_allocated_for_indexes_kb bigint Für Indizes dieser Tabelle zugeordneter Arbeitsspeicher.
memory_used_by_indexes_kb bigint Für Indizes dieser Tabelle verwendeter Speicher.

Berechtigungen

Alle Zeilen werden zurückgegeben, wenn Sie über die VIEW DATABASE STATE-Berechtigung für die aktuelle Datenbank verfügen. Andernfalls wird ein leeres Rowset zurückgegeben.

Wenn Sie nicht über die VIEW DATABASE-Berechtigung verfügen, werden alle Spalten für Zeilen in Tabellen zurückgegeben, für die Sie die SELECT-Berechtigung besitzen.

Systemtabellen werden nur für Benutzer mit der VIEW DATABASE STATE-Berechtigung zurückgegeben.

Berechtigungen für SQL Server 2022 und höher

Erfordert DIE BERECHTIGUNG "DATENBANKLEISTUNGSSTATUS ANZEIGEN" für die Datenbank.

Beispiele

Sie können die folgende DMV abfragen, um den Arbeitsspeicher abzurufen, der für die Tabellen und Indizes in der Datenbank zugeordnet ist:

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

So suchen Sie nach dem Arbeitsspeicher für alle Objekte innerhalb der Datenbank:

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;  

Benutzerszenario

Legen Sie zunächst den maximalen Serverspeicher als Sicherheitsmaßnahme auf 4 GB fest. Möglicherweise sollten Sie einen anderen Wert für Ihre Umgebung berücksichtigen.

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

Erstellen Sie einen Ressourcenpool für die Datenbank, die die speicheroptimierten Objekte enthält.

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

Binden Sie den Ressourcenpool "PoolHkdb1" an die Datenbank "HkDb1". Dies erfordert, dass die Datenbank offline/online ist, um den Pool zuzuordnen.

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

Erstellen Sie die folgenden Tabellen in einer Datenbank namens 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

Laden Sie Daten in die Tabelle.

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

Wenn Daten in eine Tabelle geladen werden, können Sie benutzerdefinierte Tabellen und den von ihnen belegten Speicher sehen. Jede Zeile einer Tabelle kann beispielsweise ungefähr 8.070 Bytes umfassen (Zuordnungsgröße ist 8 K (8.192 Bytes)). Sie können die Indizes pro Tabelle und den vom Index belegten Speicher sehen. 1 MB sind beispielsweise 100 K Einträge, die auf die nächste Zweierpotenz gerundet werden 2 (2**17) = 131072 von je 8 Bytes. Möglicherweise weist eine Tabelle keinen Index auf. In diesem Fall wird die Speicherbelegung für den Index angezeigt. Andere Zeilen können Systemtabellen darstellen.

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

Im Folgenden die zweiteilige Ausgabe:

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  

Die Ausgabe von

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;

Ist:

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

Als Nächstes betrachten wir die Ausgabe des Ressourcenpools. Beachten Sie, dass der vom Pool verwendete Arbeitsspeicher 1356 MB beträgt.

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;

Die Ausgabe ist:

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