Partilhar via


Associar um banco de dados com tabelas com otimização de memória a um pool de recursos

Um pool de recursos representa um subconjunto de recursos físicos que podem ser controlados. Por padrão, os bancos de dados do SQL Server estão associados a e consomem recursos do pool de recursos padrão. Para proteger o SQL Server de ter todos os recursos consumidos por uma ou mais tabelas com otimização de memória, e evitar que outros usuários da memória consumam a memória necessária para as tabelas com otimização de memória, você deve criar um pool de recursos separado para gerenciar o consumo de memória para o banco de dados com tabelas com otimização de memória.

Um banco de dados pode estar associado em apenas um pool de recursos. No entanto, você pode associar vários bancos de dados ao mesmo pool. SQL Server permite associar um banco de dados sem tabelas com otimização de memória a um pool de recursos, mas isso não tem efeito. Talvez você queira associar um banco de dados a um pool de recursos denominado se, no futuro, talvez você quiser criar tabelas com otimização de memória no banco de dados.

Antes de associar um banco de dados a um pool de recursos, o banco de dados e o pool de recursos devem existir. A associação entra em vigor da próxima vez que o banco de dados é colocado online. Veja Estados de banco de dados para obter mais informações.

Para obter informações sobre pools de recursos, veja Pool de recursos do Administrador de Recursos.

Criar o banco de dados e o pool de recursos

Você pode criar o banco de dados e o pool de recursos em qualquer ordem. O que importa é que ambos existam antes de associar o banco de dados ao pool de recursos.

Criar o banco de dados

O Transact-SQL a seguir cria um banco de dados chamado IMOLTP_DB que conterá uma ou mais tabelas com otimização de memória. A unidade de caminhoAndPath <> deve existir antes de executar esse comando.

CREATE DATABASE IMOLTP_DB  
GO  
ALTER DATABASE IMOLTP_DB ADD FILEGROUP IMOLTP_DB_fg CONTAINS MEMORY_OPTIMIZED_DATA  
ALTER DATABASE IMOLTP_DB ADD FILE( NAME = 'IMOLTP_DB_fg' , FILENAME = 'c:\data\IMOLTP_DB_fg') TO FILEGROUP IMOLTP_DB_fg;  
GO  

Determine o valor mínimo de MIN_MEMORY_PERCENT e MAX_MEMORY_PERCENT

Depois que você determinar as necessidades de memória para tabelas com otimização de memória, será necessário determinar o percentual de memória disponível necessário e definir os percentuais de memória com esse valor ou um valor mais alto.

Exemplo:
Para este exemplo, vamos pressupor que, com base nos cálculos, você determinou que suas tabelas com otimização de memória e índices precisam de 16 GB de memória. Digamos que você tenha 32 GB de memória confirmada para uso.

À primeira vista pode parecer que você precisa definir MIN_MEMORY_PERCENT e MAX_MEMORY_PERCENT como 50 (16 são de 50% de 32). No entanto, isso não daria memória suficiente às tabelas com otimização de memória otimizada. Examinando a tabela abaixo (Percentual de memória disponível de índices e tabelas com otimização de memória), vemos que, se houver 32 GB de memória confirmada, somente 80% dessa quantidade estará disponível para índices e tabelas com otimização de memória. Consequentemente, calculamos percentuais mínimo e máximo com base na memória disponível, não na memória confirmada.

memoryNeedeed = 16
memoryCommitted = 32
availablePercent = 0.8
memoryAvailable = memoryCommitted * availablePercent
percentNeeded = memoryNeeded / memoryAvailable

Em números reais:
percentNeeded = 16 / (32 * 0.8) = 16 / 25.6 = 0.625

Dessa forma, você precisa de pelo menos 62,5% da memória disponível para cumprir o requisito de 16 GB de tabelas com otimização de memória e índices. Como os valores de MIN_MEMORY_PERCENT e MAX_MEMORY_PERCENT devem ser inteiros, vamos configurá-los como pelo menos 63%.

Criar um pool de recursos e configurar a memória

Ao configurar a memória para tabelas com otimização de memória, o planejamento de capacidade deve ser feito com base em MIN_MEMORY_PERCENT, não MAX_MEMORY_PERCENT. Consulte ALTER RESOURCE POOL (Transact-SQL) para obter informações sobre MIN_MEMORY_PERCENT e MAX_MEMORY_PERCENT. Isso fornece uma disponibilidade de memória mais previsível para tabelas com otimização de memória porque o MIN_MEMORY_PERCENT causa uma pressão de memória em outros pools de recursos para garantir que seja cumprida. Para garantir que essa memória esteja disponível e para ajudar a evitar condições de memória insuficiente, os valores de MIN_MEMORY_PERCENT e MAX_MEMORY_PERCENT devem ser iguais. Veja Percentual de memória disponível de índices e tabelas com otimização de memória abaixo para obter o percentual de memória disponível para tabelas com otimização de memória com base na quantidade de memória confirmada.

Confira Melhores práticas: usar OLTP in-memory em um ambiente de VM para obter mais informações ao trabalhar em um ambiente de VM.

O código Transact-SQL a seguir cria um pool de recursos chamado Pool_IMOLTP com metade da memória disponível para seu uso. Depois que o pool é criado, o Administrador de Recursos é reconfigurado para incluir Pool_IMOLTP.

-- set MIN_MEMORY_PERCENT and MAX_MEMORY_PERCENT to the same value  
CREATE RESOURCE POOL Pool_IMOLTP   
  WITH   
    ( MIN_MEMORY_PERCENT = 63,   
    MAX_MEMORY_PERCENT = 63 );  
GO  
  
ALTER RESOURCE GOVERNOR RECONFIGURE;  
GO  

Associar o banco de dados ao pool

Use a função do sistema sp_xtp_bind_db_resource_pool para associar o banco de dados ao pool de recursos. A função usa dois parâmetros: o nome do banco de dados e o nome do pool de recursos.

O Transact-SQL a seguir define uma associação do banco de dados IMOLTP_DB ao pool de recursos Pool_IMOLTP. A associação não entra em vigor até que você coloque o banco de dados online.

EXEC sp_xtp_bind_db_resource_pool 'IMOLTP_DB', 'Pool_IMOLTP'  
GO  

A função de sistema sp_xtp_bind_db_resourece_pool usa dois parâmetros de cadeia de caracteres: nome_do_banco_de_dados e nome_do_pool.

Confirmar a associação

Confirme a associação, observando a ID do pool de recursos para IMOLTP_DB. Não deve ser NULL.

SELECT d.database_id, d.name, d.resource_pool_id  
FROM sys.databases d  
GO  

Tornar a associação efetiva

Você deve colocar o banco de dados offline e depois online de novo depois de associá-lo ao pool de recursos para que a associação entre em vigor. Se seu banco de dados tiver sido associado a um pool diferente anteriormente, isso removerá a memória alocada do pool de recursos anterior, e as alocações de memória para sua tabela com otimização de memória e os índices agora virão do pool de recursos recém-associado ao banco de dados.

USE master  
GO  
  
ALTER DATABASE IMOLTP_DB SET OFFLINE  
GO  
ALTER DATABASE IMOLTP_DB SET ONLINE  
GO  
  
USE IMOLTP_DB  
GO  

Agora o banco de dados está associado ao pool de recursos.

Alterar MIN MEMORY PERCENT e MAX MEMORY PERCENT em um pool existente

Se você adicionar mais memória ao servidor ou se a quantidade de memória das suas tabelas com otimização de memória for alterada, talvez seja necessário alterar o valor de MIN_MEMORY_PERCENT e de MAX_MEMORY_PERCENT. As etapas a seguir mostram como alterar o valor de MIN_MEMORY_PERCENT e MAX_MEMORY_PERCENT em um pool de recursos. Consulte a seção abaixo, para obter orientação sobre quais valores usar para MIN_MEMORY_PERCENT e MAX_MEMORY_PERCENT. Confira o tópico Melhores práticas: usar OLTP in-memory em um ambiente de VM para obter mais informações.

  1. Use ALTER RESOURCE POOL para alterar o valor de MIN_MEMORY_PERCENT e MAX_MEMORY_PERCENT.

  2. Use ALTER RESURCE GOVERNOR para reconfigurar o Administrador de Recursos com os novos valores.

Código de exemplo

ALTER RESOURCE POOL Pool_IMOLTP  
WITH  
     ( MIN_MEMORY_PERCENT = 70,  
       MAX_MEMORY_PERCENT = 70 )   
GO  
  
-- reconfigure the Resource Governor  
ALTER RESOURCE GOVERNOR RECONFIGURE  
GO  

Porcentagem de memória disponível para tabelas com otimização de memória e índices

Se você mapear um banco de dados com tabelas com otimização de memória e uma carga de trabalho do SQL Server para o mesmo pool de recursos, o Administrador de Recursos definirá um limite interno para o OLTP na memória usar de modo que os usuários do pool não tenham conflitos sobre o uso do pool. Em linhas gerais, o limite para o uso do OLTP na memória é de aproximadamente 80% do pool. A tabela a seguir mostra os limites reais para vários tamanhos de memória.

Quando você cria um pool de recursos dedicado para o banco de dados OLTP na memória , precisa estimar a quantidade de memória física necessária para as tabelas na memória, após considerar versões de linhas e o crescimento de dados. Após calcular a memória necessária, crie um pool de recursos com uma porcentagem da memória de destino de confirmação para a Instância SQL, conforme refletido pela coluna ‘committed_target_kb’ no DMV sys.dm_os_sys_info (veja sys.dm_os_sys_info). Por exemplo, você pode criar um pool de recursos P1 com 40% da memória total disponível para a instância. Além desses 40%, o mecanismo de OLTP na memória obtém uma porcentagem menor para armazenar dados de OLTP na memória . Isso é feito para garantir que OLTP na memória não consuma toda a memória desse pool. Esse valor de porcentagem menor depende da Memória confirmada de destino. A tabela a seguir descreve a memória disponível para o banco de dados de OLTP na memória em um pool de recursos (nomeado ou padrão), antes que um erro de OOM seja gerado.

Memória confirmada de destino Porcentagem disponível para tabelas na memória
<= 8 GB 70%
<= 16 GB 75%
<= 32 GB 80%
<= 96 GB 85%
>96 GB 90%

Por exemplo, se sua "memória confirmada de destino" for de 100 GB e você estimar que suas tabelas e índices com otimização de memória precisam de memória 60GBof, em seguida, você pode criar um pool de recursos com MAX_MEMORY_PERCENT = 67 (60 GB necessários / 0,90 = 66,667 GB - arredondar até 67 GB; 67 GB / 100 GB instalados = 67%) para garantir que seus objetos OLTP In-Memory tenham os 60GB necessários.

Quando um banco de dados for associado a um pool de recursos nomeado, use a consulta a seguir para ver as alocações de memória em diferentes pools de recursos.

SELECT pool_id  
     , Name  
     , min_memory_percent  
     , max_memory_percent  
     , max_memory_kb/1024 AS max_memory_mb  
     , used_memory_kb/1024 AS used_memory_mb   
     , target_memory_kb/1024 AS target_memory_mb  
   FROM sys.dm_resource_governor_resource_pools  

Esta saída de exemplo mostra que a memória usada por objetos com otimização de memória é de 1356 MB no pool de recursos, PoolIMOLTP, com um limite superior de 2307 MB. Esse limite superior controla a memória total que pode ser usada pelo usuário e os objetos com otimização de memória do sistema que são mapeados para esse pool.

Saída de exemplo
Esta saída é do banco de dados e das tabelas criadas anteriormente.

pool_id     Name        min_memory_percent max_memory_percent max_memory_mb used_memory_mb target_memory_mb  
----------- ----------- ------------------ ------------------ ------------- -------------- ----------------   
1           internal    0                  100                3845          125            3845  
2           default     0                  100                3845          32             3845  
259         PoolIMOLTP 0                  100                3845          1356           2307  

Para obter mais informações, veja sys.dm_resource_governor_resource_pools (Transact-SQL).

Se você não associa o banco de dados a um pool de recursos nomeado, ele é associado ao pool ‘padrão‘. Como o pool de recursos padrão é usado pelo SQL Server para a maioria das demais alocações, você não poderá monitorar a memória consumida por tabelas com otimização de memória usando o DMV sys.dm_resource_governor_resource_pools de forma precisa para o banco de dados de interesse.

Consulte Também

sys.sp_xtp_bind_db_resource_pool (Transact-SQL)
sys.sp_xtp_unbind_db_resource_pool (Transact-SQL)
Resource Governor
Pool de recursos do Resource Governor
Criar um pool de recursos
Alterar configurações do pool de recursos
Excluir um pool de recursos