返回当前数据库中每个 内存中 OLTP 表(用户和系统)的内存使用情况统计信息。 系统表具有负的对象 ID,并且用于为 内存中 OLTP 引擎存储运行时信息。 与用户对象不同,系统表是内部的,并且只存在于内存中,因此,通过目录视图看不到它们。 系统表用于存储信息,例如存储中所有数据/差异文件的元数据、合并请求、要筛选行的差异文件的水印、已删除表以及用于恢复和备份的相关信息。 假定 内存中 OLTP 引擎可具有最多 8,192 个数据和差异文件对,则对于大型内存中数据库,系统表占用的内存可能是几 MB。
有关详细信息,请参阅内存中 OLTP(内存中优化)。
适用于:SQL Server(SQL Server 2014 到当前版本)。 |
列名 |
数据类型 |
说明 |
|---|---|---|
object_id |
int |
表的对象 ID。 对于内存中 OLTP 系统表,为 NULL。 |
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 权限的用户返回系统表。
示例
您可以查询以下 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;
使用方案
首先,在名为 HkDb1 的数据库中创建以下表。
-- set max server memory to 4 GB
EXEC sp_configure 'max server memory (MB)', 4048
go
RECONFIGURE
go
-- create a resource pool for database with memory-optimized objects
CREATE RESOURCE POOL PoolHkDb1 WITH (MAX_MEMORY_PERCENT = 50);
ALTER RESOURCE GOVERNOR RECONFIGURE;
go
--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
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) = 131072,每个为 8 字节。 表可以没有某个索引,在这种情况下,它将显示该索引的内存分配。 其他行可代表系统表
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
接下来,让我们看一看来自资源池的输出。 请注意,该池使用的内存为 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