Quantas vezes eu ouvi administradores reclamarem que seus desenvolvedores fazem queries "assassinas", que derrubam todo o servidor. Muitas vezes. Algumas soluções atuais como particionamento e até o Database Mirroring atendem a demandas de queries que consomem mais recursos de hardware sem afetar o restante do sistema, mas estas soluções em geral requerem um servidor adicional e copiar o banco de dados com queries "pesadas" para uma outra localidade.

Agora será possível limitar os recursos de hardware que serão alocados para um banco de dados em específico - imagine poder reservar 20% do seu processador e 35% da sua memória para um banco de dados e garantir que o restante estará reservado para os outros bancos de dados: isto é o Resource Governor.

Definição

O Resource Governor é uma nova tecnologia presente no SQL Server 2008 que permite aos administradores gerenciar a carga e os recursos do SQL Server 2008. Ele faz isso através de políticas de limite de consumo de recursos (ufa). É possível criar grupos (workloads) com perfis de utilização de hardware, como "Queries de Alta Prioridade" ou "Queries Menos Importantes" e atribuir a estes workloads critérios de consumo de processador e memória. Ele não apenas é importante para limitar a utilização de processador e memória em queries que já conhecemos, mas também para garantir que queries com comportamento desconhecido se comportem de forma que não comprometam o restante da operação do servidor. Ou seja: não apenas podemos definir o que conhecemos por prioritário, mas também queries (ou requisições) que nos pegam de surpresa.

Conceitos

Quando falamos em Resource Governor, os seguintes termos precisam ser entendidos:

Resource Pools

Trata-se de um pool que representa os recursos físicos de um servidor. Ao criar um Resource Pool (por padrão, o SQL Server 2008 instala um default e um system pool), pode-se especificar um valor mínimo GARANTIDO e máximo de reserva de CPU e de memória. Você pode criar tantos pools quanto achar necessário, mas a soma dos valores mínimos de cada pool não podem exceder 100% dos recursos disponíveis (ex.: não posso ter um pool que reserva mínimo de 60% de CPU e outro que reserva mínimo de 50%). O valor máximo pode ser qualquer valor entre o mínimo e 100%. Conforme os pools são criados, o SQL Server calcula o valor real reservado para cada um dos pools. Por exemplo:

Nome do Pool

MIN %

MAX %

Efetivo (Calculado) MAX %

Calculado (compartilhado)%

Como o cálculo é feito

internal

0

100

100

0

 

default

0

100

30

30

Efetivo (MAX): min(100,100-(20+50)) = 30.
Compartilhado: MAX (Efetivo) - MIN = 30.

Pool 1

20

100

50

30

Efetivo (MAX): min(100,100-50) = 50.
Compartilhado: MAX (Efetivo) - MIN = 30.

Pool 2

50

70

70

20

Efetivo (MAX): min(70,100-20) = 70.
Compartilhado: MAX (Efetivo) - MIN = 20.

Se outros pools forem criados, os valores efetivos e compartilhados seriam recalculados, de acordo com o requerimento mínimo do novo pool.

Workload Groups

Os Workload Groups são containers que agrupam requisições que tem algo em comum.

Classification

Utilizamos Classifications para identificar sessões abertas ao SQL Server 2008 e atribuí-las a Workload Groups. São criadas funções que analisam um critério e estas funções são executadas em TODAS as conexões abertas ao SQL Server para que o encaminhamento seja feito. Veremos mais a frente como a classificação é feita (o que é avaliado no instante da conexão).

Como utilizar e exemplos

Recomendo fortemente que você comece a testar o Resource Governor e se familiarizar com sua configuração. Veremos aqui que é bastante simples habilitar e começar a criar seus Resource Pools.

Habilitar e Desabilitar o Resource Governor

Para habilitar ou desabilitar, simplesmente abra o SQL Server Management Studio, expanda Management e clique com o botão direito em Resource Governor, como na figura abaixo. Selecione Enable ou Disable (respectivamente).

rg1

Configurar Resource Pools e Workload Groups

Ao clicar com o botão direito do mouse sobre o Resource Governor e selecionando properties, a janela da figura abaixo é exibida. Ela também será exibida se clicarmos em "New Resource Pool". Perceba que a lista de Workload groups for resource pool (itens do grid de baixo) exibe apenas os Workload Groups do Resource Pool selecionado

rg2 

Classificar as conexões e utilizar os pools corretos

O código abaixo cria uma função que avalia o nome do usuário conectado e a aplicação de origem e registra esta função com o Resource Governor:

CREATE FUNCTION rgclassifier_v1() RETURNS SYSNAME
WITH SCHEMABINDING
AS
BEGIN
    DECLARE
@grp_name AS SYSNAME
      IF (SUSER_NAME() = 'sa')
          SET @grp_name = 'groupAdmin'
      IF (APP_NAME() LIKE '%MANAGEMENT STUDIO%')
          OR (APP_NAME() LIKE '%QUERY ANALYZER%')
          SET @grp_name = 'groupAdhoc'
      IF (APP_NAME() LIKE '%REPORT SERVER%')
          SET @grp_name = 'groupReports'
    RETURN @grp_name
END
GO

--Registra a função com o Resource Governor
ALTER RESOURCE GOVERNOR WITH (CLASSIFIER_FUNCTION= dbo.rgclassifier_v1)

Perceba que o Resource Governor registrou a função

rg3

Conclusão

As possibilidades são infinitas. O maior desafio vai ser definir os Resource Pools e a classificação das conexões. O Resource Governor resolve de forma muito simples (gráfica, embora tudo possa ser feito por T-SQL) uma necessidade importante dos administradores SQL Server. Os exemplos acima são superficiais e refletem o estado do SQL Server 2008 CTP5.