Partilhar via


sys.dm_db_xtp_table_memory_stats (Transact-SQL)

Aplica-se a:SQL ServerBanco de Dados SQL do AzureInstância Gerenciada SQL do Azure

Devolve estatísticas de utilização de memória para cada tabela OLTP In-Memory (utilizador e sistema) na base de dados atual. As tabelas do sistema têm IDs negativos de objetos e são usadas para armazenar informação em tempo de execução para o motor OLTP In-Memory. Ao contrário dos objetos de utilizador, as tabelas do sistema são internas e só existem na memória, pelo que não são visíveis através das visualizações de catálogo. As tabelas do sistema são usadas para armazenar informações como metadados de todos os ficheiros de dados/delta em armazenamento, pedidos de fusão, marcas de água para ficheiros delta para filtrar linhas, tabelas eliminadas e informações relevantes para recuperação e backups. Dado que o motor OLTP In-Memory pode ter até 8.192 pares de dados e ficheiros delta, para grandes bases de dados em memória, a memória ocupada pelas tabelas do sistema pode ser de alguns megabytes.

Para obter mais informações, consulte In-Memory OLTP (In-Memory Optimization).

Nome da coluna Tipo de dados Description
object_id int O ID do objeto da tabela. NULL para In-Memory tabelas do sistema OLTP.
memory_allocated_for_table_kb bigint Memória alocada para esta tabela.
memory_used_by_table_kb bigint Memória usada pela tabela, incluindo versões por linhas.
memory_allocated_for_indexes_kb bigint Memória alocada para índices nesta tabela.
memory_used_by_indexes_kb bigint Memória consumida para índices nesta tabela.

Permissions

Todas as linhas são devolvidas se tiver permissão VER ESTADO DA BASE DE DADOS na base de dados atual. Caso contrário, um conjunto de linhas vazio é devolvido.

Se não tiver permissão VER BASE de DADOS, todas as colunas serão devolvidas para linhas em tabelas para as quais tem permissão SELECT.

As tabelas do sistema são devolvidas apenas para utilizadores com permissão VIEW DATABASE STATE.

Permissões para SQL Server 2022 e posterior

É necessária a permissão VIEW DATABASE PERFORMANCE STATE no banco de dados.

Examples

Pode consultar o seguinte IMT para obter a memória alocada para as tabelas e índices dentro da base de dados:

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

Para encontrar memória para todos os objetos dentro da base de dados:

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;  

Cenário do Utilizador

Primeiro, defina a memória máxima do servidor para 4GB como medida de segurança. Pode querer considerar um valor diferente para o seu ambiente.

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

Crie um pool de recursos para a base de dados que contenha os objetos otimizados para memória.

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

Vincule o pool de recursos 'PoolHkdb1' à base de dados 'HkDb1'. Isto requer levar a base de dados offline/online para associar o pool.

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

Crie as seguintes tabelas numa base de dados chamada 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

Carregue dados na tabela.

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

Quando os dados são carregados numa tabela, pode ver as tabelas definidas pelo utilizador e quanto armazenamento estão a usar. Por exemplo, cada linha de uma tabela pode ter aproximadamente 8070 bytes (o tamanho da alocação é 8K (8192 bytes)). Pode ver os índices por tabela e quanto espaço de armazenamento o índice utiliza. Por exemplo, 1MB são 100K entradas arredondadas para a potência seguinte de 2 (2**17) = 131072 de 8 bytes cada. Uma tabela pode não ter um índice, caso em que mostrará a alocação de memória para o índice. Outras linhas podem representar tabelas do sistema

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

Aqui está o resultado, dividido em duas partes:

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  

A saída de,

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  

De seguida, vejamos a saída do pool de recursos. Note-se que a memória usada do pool é de 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;

A saída:

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