sys.dm_db_xtp_table_memory_stats (Transact-SQL)

gäller för:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

Returnerar minnesanvändningsstatistik för varje In-Memory OLTP-tabell (användare och system) i den aktuella databasen. Systemtabellerna har negativa objekt-ID:n och används för att lagra körtidsinformation för den In-Memory OLTP-motorn. Till skillnad från användarobjekt är systemtabeller interna och existerar endast i minnet, därför är de inte synliga genom katalogvyer. Systemtabeller används för att lagra information såsom metadata för alla data-/deltafiler i lagring, sammanslagningsförfrågningar, vattenstämplar för deltafiler för att filtrera rader, bortlagda tabeller och relevant information för återställning och backup. Eftersom den In-Memory OLTP-motorn kan ha upp till 8 192 data- och delta-filpar, kan minnesanvändningen för stora minnesdatabaser vara några få megabyte.

Mer information finns i In-Memory OLTP (In-Memory Optimization).

Kolumnnamn Datatyp Description
object_id int Objekt-ID:t för tabellen. NULL för In-Memory OLTP-systemtabeller.
memory_allocated_for_table_kb bigint Minne som är avsatt för denna tabell.
memory_used_by_table_kb bigint Minnet som används av tabellen, inklusive radversioner.
memory_allocated_for_indexes_kb bigint Minne som tilldelats index i denna tabell.
memory_used_by_indexes_kb bigint Minne som förbrukas för index i denna tabell.

Permissions

Alla rader returneras om du har behörighet VIEW DATABASE STATE på den aktuella databasen. Annars returneras en tom raduppsättning.

Om du inte har behörighet VISA DATABAS kommer alla kolumner att returneras för rader i tabeller där du har SELECT-behörighet.

Systemtabeller returneras endast för användare med behörighet VISA DATABASTILLSTÅND.

Behörigheter för SQL Server 2022 och senare

Kräver behörigheten VISA DATABASPRESTANDATILLSTÅND för databasen.

Examples

Du kan fråga följande DMV för att få det minne som tilldelats tabellerna och indexen i databasen:

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

För att hitta minne för alla objekt i databasen:

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;  

Användarscenario

Först, sätt maxvärdet av serverminnet till 4 GB som en säkerhetsåtgärd. Du kanske vill överväga ett annat värde för din miljö.

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

Skapa en resurspool för databasen som innehåller de minnesoptimerade objekten.

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

Bind resurspoolen 'PoolHkdb1' till databasen 'HkDb1'. Detta kräver att databasen tas offline/online för att associera poolen.

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

Skapa följande tabeller i en databas som heter 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

Läs in data i tabellen.

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

När data laddas in i en tabell kan du se användardefinierade tabeller och hur mycket lagring den använder. Till exempel kan varje rad i en tabell vara ungefär 8070 byte (allokeringsstorleken är 8K (8192 byte)). Du kan se index per tabell och hur mycket lagring indexet använder. Till exempel är 1 MB 100 000 poster avrundade till nästa potens av 2 (2**17) = 131072 av 8 byte vardera. En tabell kanske inte har något index, i vilket fall den visar minnesallokering för indexet. Andra rader kan representera systemtabeller

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

Här är resultatet, i två delar:

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  

Resultatet av,

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;

vara:

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

Nästa steg är att titta på utdata från resurspoolen. Observera att minnet som används från poolen är 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;

Utdata:

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