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 VIEWDATABASE STATE-behörighet i den aktuella databasen. Annars returneras en tom raduppsättning.

Om du inte har VIEWDATABASE behörighet 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 VIEWDATABASE STATE-behörighet.

Behörigheter för SQL Server 2022 och senare

Kräver VIEWDATABASE PERFORMANCE STATE-behörighet i 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