sys.dm_db_xtp_table_memory_stats (Transact-SQL)
適用対象: SQL Server Azure SQL Database Azure 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;
ユーザー シナリオ
まず、安全対策として最大サーバー メモリを 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