Controlar os recursos do SQL Server
Embora algumas instâncias gerenciadas do SQL do Azure ou SQL Servers ofereçam suporte apenas a bancos de dados de um aplicativo (essa configuração normalmente é vista em aplicativos de missão crítica), muitos servidores oferecem suporte a bancos de dados para vários aplicativos com requisitos de desempenho diferentes e ciclos de carga de trabalho de pico. O balanceamento desses requisitos diferentes pode ser desafiador para o administrador. Uma das maneiras de balancear os recursos do servidor é usar o Resource Governor, que foi introduzido para o SQL Server 2008.
O Resource Governor é um recurso do SQL Server e da Instância Gerenciada de SQL do Azure que permite controlar de modo granular a quantidade de CPU, E/S física e os recursos de memória que podem ser usados por uma solicitação de entrada de um aplicativo. O Resource Governor está habilitado no nível de instância e permite que você defina como as conexões são tratadas usando uma função de classificação, que subdivide sessões no grupo de cargas de trabalho. Cada grupo de carga de trabalho é configurado para usar um pool específico de recursos do sistema.
Pools de recursos
Um pool de recursos representa recursos físicos disponíveis no servidor. O SQL Server sempre tem dois pools, padrão e interno, mesmo quando o Resource Governor não está habilitado. O pool interno é usado por funções críticas do SQL Server e não pode ser restrito. O pool padrão e todos os pools de recursos que você define explicitamente podem ser configurados com limites nos recursos que ele pode usar. Você pode especificar os seguintes limites para cada pool não interno:
Percentual mínimo/máximo de CPU
Limite de percentual de CPU
Percentual mínimo/máximo de memória
Afinidade do nó NUMA
Mínimo/máximo de IOPS por volume
Observação
As alterações a um pool afetam apenas as novas sessões, não as existentes. Uma alteração a um pool não ajudará a restringir os recursos de um processo de execução demorada. A exceção são os pools externos usados em conjunto com os Serviços de Machine Learning do SQL Server, que são externos ao SQL Server e podem ser limitados por uma alteração de pool.
Com exceção de percentual mínimo/máximo da CPU, todas as outras configurações do pool de recursos representam os limites rígidos e não podem ser excedidas. O percentual mínimo/máximo da CPU será aplicado somente quando houver contenção de CPU. Por exemplo, se você tiver um máximo de 70%, se houver ciclos de CPU disponíveis, a carga de trabalho poderá usar até 100%. Se houver outras cargas de trabalho em execução, a carga de trabalho será restrita a 70%.
Grupo de carga de trabalho
Um grupo de carga de trabalho é um contêiner para solicitações de sessão com base em sua classificação pela função de classificação. Assim como os pools de recursos, há dois grupos internos, padrão e internos, e cada grupo de carga de trabalho só pode pertencer a um pool de recursos. No entanto, um pool de recursos pode hospedar vários grupos de carga de trabalho. Todas as conexões vão para o grupo de cargas de trabalho padrão, a menos que passem para outro grupo definido pelo usuário pela função de classificação. Por padrão, o grupo de carga de trabalho padrão usa os recursos atribuídos ao pool de recursos padrão.
Função de Classificador
A função de classificação é executada no momento que uma conexão é estabelecida com a instância do SQL Server e classifica cada conexão em um determinado grupo de cargas de trabalho. Se a função retornar NULL, padrão ou nome do grupo de carga de trabalho inexistente, a sessão será transferida para o grupo de carga de trabalho padrão. Como o classificador é executado em cada conexão, sua eficiência deve ser testada. A imagem a seguir mostra uma função de classificador de exemplo que classifica os usuários com base no nome de usuário.
CREATE FUNCTION dbo.RGClassifier()
RETURNS SYSNAME
WITH SCHEMABINDING
AS
BEGIN
DECLARE @WorkloadGroup AS SYSNAME
IF(SUSER_NAME() = 'ReportUser')
SET @WorkloadGroup = 'ReportServerGroup'
ELSE IF (SUSER_NAME() = 'PrimaryUser')
SET @WorkloadGroup = 'PrimaryServerGroup'
ELSE
SET @WorkloadGroup = 'default'
RETURN @WorkloadGroup
END
Você pode aumentar a complexidade da definição de função mostrada no exemplo, mas deve verificar se a função mais complexa não afeta o desempenho de logon do usuário.
Casos de uso do Resource Governor
O Resource Governor é usado principalmente em cenários multilocatário em que um grupo de bancos de dados compartilha uma instância do SQL Server e o desempenho precisa ser mantido consistente para todos os usuários do servidor. Você também pode usar o Resource Governor para limitar os recursos usados por operações de manutenção, como verificações de consistência e rebuilds de índice, para tentar garantir recursos suficientes para consultas de usuário durante as janelas de manutenção.