Aracılığıyla paylaş


sys.dm_db_xtp_table_memory_stats (Transact-SQL)

Şunlar için geçerlidir:SQL ServerAzure SQL VeritabanıAzure SQL Yönetilen Örneği

Mevcut veritabanındaki her In-Memory OLTP tablosu (kullanıcı ve sistem) için bellek kullanım istatistiklerini döndürür. Sistem tabloları negatif nesne kimliklerine sahiptir ve In-Memory OLTP motoru için çalışma zamanı bilgilerini depolamak için kullanılır. Kullanıcı nesnelerinin aksine, sistem tabloları dahili olup sadece bellek içinde bulunur, bu nedenle katalog görünümlerinde görünmezler. Sistem tabloları, depodaki tüm veri/delta dosyaları için meta veriler, birleştirme talepleri, satır filtrelemek için delta dosyaları için watermarklar, bırakılan tablolar ve kurtarma ile yedekleme için ilgili bilgiler gibi bilgileri depolamak için kullanılır. In-Memory OLTP motorunun 8.192'ye kadar veri ve delta dosya çiftlerine sahip olabileceği göz önüne alındığında, büyük bellek içi veritabanları için sistem tablolarının aldığı bellek birkaç megabayt olabilir.

Daha fazla bilgi için bkz. In-Memory OLTP (In-Memory İyileştirme).

Sütun adı Veri türü Description
object_id int Tablonun nesne kimliği. NULL In-Memory OLTP sistem tabloları için.
memory_allocated_for_table_kb bigint Bu tablo için ayrılan bellek.
memory_used_by_table_kb bigint Tablo tarafından kullanılan bellek, satır sürümleri dahil.
memory_allocated_for_indexes_kb bigint Bu tablodaki indeksler için ayrılan bellek.
memory_used_by_indexes_kb bigint Bu tablodaki indeksler için kullanılan bellek.

Permissions

Mevcut veritabanında VIEW DATABASE STATE izniniz varsa tüm satırlar döner. Aksi takdirde, boş bir satır kümesi geri döner.

VIEW DATABASE izniniz yoksa, SELECT izniniz olan tablolardaki satırlar için tüm sütunlar geri gönderilir.

Sistem tabloları yalnızca VIEW DATABASE STATE iznine sahip kullanıcılar için döner.

SQL Server 2022 ve üzeri için izinler

Veritabanında veritabanı performans durumunu görüntüleme izni gerektirir.

Örnekler

Veritabanındaki tablolar ve indeksler için tahsis edilen belleği almak için aşağıdaki DMV'yi sorgulayabilirsiniz:

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

Veritabanındaki tüm nesneler için bellek bulmak için:

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;  

Kullanıcı Senaryosu

İlk olarak, güvenlik önlemi olarak maksimum sunucu belleğini 4GB olarak ayarlayın. Çevreniz için farklı bir değer düşünmek isteyebilirsiniz.

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

Veritabanı için bellek optimize edilmiş nesneleri içeren bir kaynak havuzu oluşturun.

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

'PoolHkdb1' kaynak havuzunu 'HkDb1' veritabanına bağlayın. Bu, havuzu ilişkilendirmek için veritabanını çevrimdışı/çevrimiçi olarak almayı gerektirir.

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

Aşağıdaki tabloları bir veritabanında oluşturun 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

Tabloya veri yükleyin.

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

Veri bir tabloya yüklendiğinde, kullanıcı tanımlı tabloları ve ne kadar depolama kullandığını görebilirsiniz. Örneğin, bir tablonun her satırı yaklaşık 8070 bayt olabilir (tahsis boyutu 8K (8192 bayt)). Tablo başına indeksleri ve indeksin ne kadar depolama kullandığını görebilirsiniz. Örneğin, 1MB, her biri 8 baytlık 2 (2**17) = 131072 kaderine yuvarlanan 100K giriştir. Bir tabloda bir indeks olmayabilir, bu durumda indeks için bellek tahsisi gösterilir. Diğer satırlar sistem tablolarını temsil edebilir

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

İşte çıktı, iki bölümden oluşuyor:

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  

Çıktısı,

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;

dir:

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

Sonra, kaynak havuzundan çıkan çıktıya bakalım. Havuzdan kullanılan bellek 1356 MB'tir.

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;

Çıkış:

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