sys.dm_db_xtp_table_memory_stats (Transact-SQL)
Gilt für: SQL Server Azure SQL-Datenbank Azure 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 VIEW DATABASE PERFORMANCE STATE-Berechtigung 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
Zugehöriger Inhalt
- Einführung in speicheroptimierte Tabellen
- Speicheroptimierte Dynamische Tabellenverwaltungsansichten
- In-Memory OLTP –Übersicht und Nutzungsszenarien
- Optimieren der Leistung mithilfe von In-Memory-Technologien in Azure SQL-Datenbank
- Optimieren der Leistung mithilfe von In-Memory-Technologien in Azure SQL verwaltete Instanz