sys.dm_db_xtp_table_memory_stats(Transact-SQL)

적용 대상:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

현재 데이터베이스의 각 메모리 내 OLTP 테이블(사용자 및 시스템)에 대한 메모리 사용 통계를 반환합니다. 시스템 테이블에는 음수 개체 ID가 있으며 메모리 내 OLTP 엔진에 대한 런타임 정보를 저장하는 데 사용됩니다. 사용자 개체와 달리 시스템 테이블은 내부에 있으며 메모리 내에만 존재하므로 카탈로그 뷰를 통해 보이지 않습니다. 시스템 테이블은 스토리지의 모든 데이터/델타 파일에 대한 메타데이터, 병합 요청, 행을 필터링하는 델타 파일의 워터마크, 삭제된 테이블 및 복구 및 백업 관련 정보와 같은 정보를 저장하는 데 사용됩니다. 메모리 내 OLTP 엔진에는 최대 8,192개의 데이터와 델타 파일 쌍이 있을 수 있으며, 메모리 내 큰 데이터베이스의 경우 시스템 테이블에서 사용하는 메모리는 몇 메가바이트일 수 있습니다.

자세한 내용은 메모리 내 OLTP(메모리 내 최적화)를 참조하세요.

열 이름 데이터 형식 설명
object_id int 테이블의 개체 ID입니다. NULL 메모리 내 OLTP 시스템 테이블의 경우
memory_allocated_for_table_kb bigint 이 테이블에 할당된 메모리입니다.
memory_used_by_table_kb bigint 행 버전을 포함하여 테이블에서 사용되는 메모리입니다.
memory_allocated_for_indexes_kb bigint 이 테이블의 인덱스에 할당된 메모리입니다.
memory_used_by_indexes_kb bigint 이 테이블의 인덱스에 사용되는 메모리입니다.

사용 권한

현재 데이터베이스에 대한 VIEW DATABASE STATE 권한이 있는 경우 모든 행이 반환됩니다. 그렇지 않으면 빈 행 집합이 반환됩니다.

VIEW DATABASE 권한이 없는 경우 SELECT 권한이 있는 테이블의 행에 대해 모든 열이 반환됩니다.

시스템 테이블은 VIEW DATABASE STATE 권한이 있는 사용자에 대해서만 반환됩니다.

SQL Server 2022 이상에 대한 권한

데이터베이스에 대한 VIEW DATABASE PERFORMANCE STATE 권한이 필요합니다.

예제

다음 DMV를 쿼리하여 데이터베이스 내의 테이블 및 인덱스에 할당된 메모리를 가져올 수 있습니다.

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

데이터베이스 내에서 모든 개체에 대한 메모리를 찾으려면:

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;  

사용자 시나리오

먼저 최대 서버 메모리를 안전 측정값으로 4GB로 설정합니다. 환경에 다른 값을 고려할 수 있습니다.

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

메모리 최적화 개체를 포함하는 데이터베이스에 대한 리소스 풀을 만듭니다.

-- 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'을 데이터베이스 'HkDb1'에 바인딩합니다. 이렇게 하려면 풀을 연결하기 위해 데이터베이스를 오프라인/온라인으로 전환해야 합니다.

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

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

테이블에 데이터를 로드합니다.

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

데이터가 테이블에 로드되면 사용자 정의 테이블과 이 테이블이 사용하고 있는 스토리지 양을 볼 수 있습니다. 예를 들어, 테이블의 각 행은 약 8070바이트(할당 크기는 8K(8192바이트))일 수 있습니다. 테이블당 인덱스 및 인덱스가 사용하는 스토리지 양을 볼 수 있습니다. 예를 들어 1MB는 100K 항목이 2(2**17) = 각각 8바이트의 131072 다음으로 반올림됩니다. 테이블에 인덱스가 없을 수 있습니다. 이 경우 인덱스 메모리 할당이 표시됩니다. 다른 행은 시스템 테이블을 나타낼 수 있습니다.

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

출력은 다음 두 부분으로 구성됩니다.

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  

의 출력

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;

은 다음과 같습니다.

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

다음으로 리소스 풀의 출력을 살펴보겠습니다. 풀에서 사용되는 메모리는 1356MB입니다.

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;

출력은 다음과 같습니다.

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