Compartilhar via


Associar um banco de dados com tabelas Memory-Optimized 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 são associados e consomem os recursos do pool de recursos padrão. Para proteger o SQL Server de ter seus recursos consumidos por uma ou mais tabelas com otimização de memória e impedir que outros usuários de memória consumam a memória necessária para 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 ser associado a apenas um pool de recursos. No entanto, você pode associar vários bancos de dados ao mesmo pool. O SQL Server permite associar um banco de dados sem tabelas com otimização de memória a um pool de recursos, mas não tem efeito. Talvez você queira associar um banco de dados a um pool de recursos nomeado se, no futuro, desejar 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 na próxima vez que o banco de dados for colocado online. Consulte Estados de Banco de Dados para obter mais informações.

Para obter informações sobre pools de recursos, consulte o 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 existem 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. O caminho <driveAndPath> deve existir antes de executar este 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  

Determinar o valor mínimo para MIN_MEMORY_PERCENT e MAX_MEMORY_PERCENT

Depois de determinar as necessidades de memória para suas tabelas com otimização de memória, você precisará determinar qual porcentagem de memória disponível você precisa e definir os percentuais de memória para esse valor ou superior.

Exemplo:
Para este exemplo, presumiremos que, de seus cálculos, você determinou que suas tabelas e índices com otimização de memória precisam de 16 GB de memória. Suponha que você tenha 32 GB de memória alocada para seu uso.

À primeira vista, pode parecer que você precisa definir MIN_MEMORY_PERCENT e MAX_MEMORY_PERCENT como 50 (16 é 50% de 32). No entanto, isso não daria memória suficiente às tabelas com otimização de memória. Examinando a tabela abaixo (porcentagem de memória disponível para tabelas e índices com otimização de memória), vemos que, se houver 32 GB de memória confirmada, apenas 80% estão disponíveis para tabelas e índices com otimização de memória. Portanto, calculamos os 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

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

Portanto, você precisa de pelo menos 62,5% da memória disponível para atender ao requisito de 16 GB de suas tabelas e índices com otimização de memória. Como os valores de MIN_MEMORY_PERCENT e MAX_MEMORY_PERCENT devem ser inteiros, definimos-os 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 em 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, pois MIN_MEMORY_PERCENT causa pressão de memória para outros pools de recursos para garantir que ela seja respeitada. Para garantir que a memória esteja disponível e ajudar a evitar condições fora da memória, os valores para MIN_MEMORY_PERCENT e MAX_MEMORY_PERCENT devem ser os mesmos. Consulte Porcentagem de memória disponível para tabelas e índices 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.

Consulte as práticas recomendadas: usando In-Memory OLTP 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 uso. Depois que o pool é criado, o Resource Governor é 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 sp_xtp_bind_db_resource_pool do sistema 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 se torna eficaz até que você deixe o banco de dados online.

EXEC sp_xtp_bind_db_resource_pool 'IMOLTP_DB', 'Pool_IMOLTP'  
GO  

A função do sistema sp_xtp_bind_db_resource_pool usa dois parâmetros de texto: database_name e pool_name.

Confirmar a associação

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

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

Tornar o vínculo eficaz

Você deve colocar o banco de dados offline e voltar a ficar online depois de vinculá-lo ao pool de recursos para que a associação entre em vigor. Se o 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 associado recentemente 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  

E 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 memória adicional ao servidor ou a quantidade de memória necessária para as alterações de tabelas com otimização de memória, talvez seja necessário alterar o valor de MIN_MEMORY_PERCENT e 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 diretrizes sobre quais valores usar para MIN_MEMORY_PERCENT e MAX_MEMORY_PERCENT. Consulte o tópico Práticas Recomendadas: Usando In-Memory OLTP 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 Resource Governor com os novos valores.

de 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 índices e tabelas com otimização de memória

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 In-Memory uso do OLTP para que os usuários do pool não tenham conflitos sobre o uso do pool. De um modo geral, o limite para In-Memory uso de OLTP é de cerca de 80% do pool. A tabela a seguir mostra os limites reais para vários tamanhos de memória.

Ao criar um pool de recursos dedicado para o banco de dados OLTP In-Memory, você precisa estimar a quantidade de memória física necessária para as tabelas na memória após a contabilização de versões de linha e crescimento de dados. Depois de estimar a memória necessária, você criará um pool de recursos com um percentual da memória de destino de confirmação para a Instância de SQL, conforme refletido pela coluna 'committed_target_kb' na DMV sys.dm_os_sys_info (consulte sys.dm_os_sys_info). Por exemplo, você pode criar um pool de recursos P1 com 40% do total de memória disponível para a instância. Destes 40%, uma porcentagem menor é atribuída ao mecanismo OLTP In-Memory para armazenar dados OLTP In-Memory. Isso é feito para garantir que In-Memory OLTP não consuma toda a memória desse pool. Esse valor do percentual menor depende da memória comprometida de destino. A tabela a seguir descreve a memória disponível para o banco de dados OLTP In-Memory em um pool de recursos (nomeado ou padrão) antes de um erro de OOM ser 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 comprometida de destino" for de 100 GB e você estimar que suas tabelas e índices otimizados para memória precisam de 60 GB de memória, então você pode criar um pool de recursos com MAX_MEMORY_PERCENT = 67 (60 GB necessários / 0,90 = 66,667 GB - arredondar para 67 GB; 67 GB / 100 GB instalados = 67%) para garantir que seus objetos OLTP In-Memory tenham os 60 GB necessários.

Depois que um banco de dados tiver sido associado a um pool de recursos nomeado, use a consulta a seguir para ver 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 utilizada por objetos otimizados para memória é de 1356 MB no pool de recursos, PoolIMOLTP, com um limite máximo de 2307 MB. Esse limite superior controla a memória total que pode ser obtida por objetos com otimização de memória do usuário e do sistema mapeados para esse pool.

Saída de exemplo
Essa saída é do banco de dados e das tabelas que criamos acima.

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 , consulte sys.dm_resource_governor_resource_pools (Transact-SQL).

Se você não associar seu banco de dados a um pool de recursos nomeado, ele será associado ao pool 'padrão'. Como o pool de recursos padrão é usado pelo SQL Server para a maioria das outras alocações, você não poderá monitorar com precisão a memória consumida por tabelas otimizadas para memória usando a DMV sys.dm_resource_governor_resource_pools no 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)
Administrador de Recursos
Pool de recursos do Resource Governor
Criar um pool de recursos
Alterar configurações do pool de recursos
Excluir um pool de recursos