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 DATABA Standard Edition 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;  

ユーザー シナリオ

まず、安全対策として最大サーバー メモリを 4 GB に設定します。 ご利用の環境に別の値を検討することをお考えになる場合があります。

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

データがテーブルに読み込まれると、ユーザー定義テーブルとその使用しているストレージの量を確認できます。 たとえば、テーブル内の各行が約 8,070 バイト (割り当てサイズは 8 K (8,192 バイト)) を使用していることなどを確認できます。 テーブルごとのインデックスと、インデックスが使用するストレージの量を確認できます。 たとえば、1 MB (メガバイト) は、次の 2 (2**17) = 8 バイトの131072に丸められた 100,000 個のエントリです。 テーブルにはインデックスがない場合があります。このような場合は、インデックスに対するメモリ割り当てが表示されます。 その他の行はシステム テーブルを表す場合があります

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

2 つの部分で出力を次に示します。

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  

次に、リソース プールからの出力を確認してみましょう。 プールから使用されるメモリは 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;

出力は次のようになります。

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