Partilhar via


Associar um banco de dados contendo Memory-Optimized tabelas a um pool de recursos

Aplica-se a:SQL Server

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 vinculados 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 para evitar 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 vinculado em apenas um pool de recursos. No entanto, você pode vincular vários bancos de dados ao mesmo pool. O SQL Server permite vincular 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 vincular 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 vincular um banco de dados a um pool de recursos, o banco de dados e o pool de recursos devem existir. A vinculação entra em vigor na próxima vez que o banco de dados for colocado online. Consulte Estados do Banco de Dados para obter mais informações.

Para obter informações sobre pools de recursos, consulte Resource Governor Resource Pool.

Etapas para vincular um banco de dados a um pool de recursos

  1. Criar o banco de dados e o pool de recursos

    1. Criar o banco de dados

    2. Determine o valor mínimo para MIN_MEMORY_PERCENT e MAX_MEMORY_PERCENT

    3. Criar um pool de recursos e configurar a memória

  2. Vincular o banco de dados ao pool

  3. Confirme a ligação

  4. Tornar a ligação eficaz

Outros conteúdos neste tópico

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 vincular o banco de dados ao pool de recursos.

Criar a base de dados

A 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ê precisa determinar qual porcentagem de memória disponível é necessária e definir as porcentagens de memória para esse valor ou superior.

Exemplo:
Para este exemplo, vamos supor que, a partir de seus cálculos, você determinou que suas tabelas e índices otimizados para memória precisam de 16 GB de memória. Suponha que tem 32 GB de memória disponível para o seu uso.

À primeira vista, pode parecer que precisas configurar MIN_MEMORY_PERCENT e MAX_MEMORY_PERCENT para 50 (16 é 50% de 32). No entanto, isso não daria às suas tabelas com otimização de memória memória suficiente. Olhando para a tabela abaixo (Porcentagem de memória disponível para tabelas e índices otimizados para memória), vemos que, se houver 32 GB de memória comprometida, apenas 80% disso está disponível para tabelas e índices otimizados para memória. Portanto, calculamos as porcentagens min e max com base na memória disponível, não na memória comprometida.

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

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

Deste modo, necessita de pelo menos 62,5% da memória disponível para cumprir o requisito de 16 GB para as suas tabelas e índices otimizados em termos de memória. Como os valores para MIN_MEMORY_PERCENT e MAX_MEMORY_PERCENT devem ser inteiros, nós os definimos para 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. Veja 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 de falta de 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 a porcentagem de memória disponível para tabelas com otimização de memória com base na quantidade de memória comprometida.

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

Vincular o banco de dados ao pool

Use a função do sistema sp_xtp_bind_db_resource_pool para vincular 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.

A Transact-SQL a seguir define uma associação do banco de dados IMOLTP_DB ao pool de recursos Pool_IMOLTP. A vinculaçã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 do sistema sp_xtp_bind_db_resource_pool usa dois parâmetros de cadeia de caracteres: database_name e pool_name.

Confirmar a ligação

Confirme a ligação, anotando 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 a vinculação eficaz

Você deve colocar o banco de dados offline e online novamente depois de vinculá-lo ao pool de recursos para que a vinculação entre em vigor. Se o seu banco de dados estava vinculado a um pool diferente anteriormente, isto remove a memória alocada do pool de recursos previamente utilizado e as alocações de memória para a sua tabela e índices otimizados para memória agora virão do pool de recursos atualmente vinculado 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á vinculado 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 tabelas com otimização de memória for alterada, 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 secção abaixo para obter orientações sobre os valores a utilizar para MIN_MEMORY_PERCENT e MAX_MEMORY_PERCENT. Consulte o tópico Práticas recomendadas: Usando In-Memory OLTP em um ambiente 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 RESOURCE 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 e índices 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 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 do 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 depois de contabilizar as versões de linha e o crescimento de dados. Depois de estimar a memória necessária, cria-se um pool de recursos com uma percentagem da memória-alvo de confirmação para a instância do SQL, conforme refletido pela coluna 'committed_target_kb' na DMV 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. Desses 40%, o mecanismo OLTP In-Memory recebe uma menor percentagem para armazenar os dados OLTP In-Memory. Isso é feito para garantir In-Memory OLTP não consuma toda a memória desse pool. Este valor de percentagem menor depende da memória comprometida alvo. A tabela a seguir descreve a memória disponível para In-Memory banco de dados OLTP em um pool de recursos (nomeado ou padrão) antes que um erro OOM seja gerado.

Memória confirmada de destino Percentagem disponível para tabelas em 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 (60GB necessários / 0,90 = 66,667GB - arredondar para 67GB; 67GB / 100GB instalados = 67%) para garantir que seus objetos OLTP In-Memory tenham os 60GB necessários.

Depois que um banco de dados tiver sido vinculado 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 os objetos otimizados para uso de memória utilizam 1356 MB no pool de recursos, PoolIMOLTP, com um limite superior de 2307 MB. Este limite superior controla a memória total que pode ser ocupada por objetos otimizados para a memória do utilizador e do sistema mapeados para este pool.

Exemplo de saída
Esta saída é do banco de dados e 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         Pool_IMOLTP 0                  100                3845          1356           2307  

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

Se você não vincular seu banco de dados a um pool de recursos nomeado, ele será vinculado 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 a memória consumida por tabelas com otimização de memória usando o sys.dm_resource_governor_resource_pools DMV com precisão para o banco de dados de interesse.

Ver 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 as configurações do pool de recursos
Eliminar um Pool de Recursos