TECNOLOGIA - Performance/Lentidão/Travamentos - Quais as configurações adequadas para utilização do sistema em base de dados Microsoft SQLServer
Dúvida
Quais as configurações adequadas para utilização do sistema em base de dados Microsoft SQLServer?
Solução
Todas as configurações e recomendações para utilização dos sistemas Senior de Tecnologia G5/G6 podem ser encontradas na Documentação da Senior, especificamente na parte de Tecnologia (Clique aqui para acessar a documentação).
Neste artigo você encontrará orientações abrangentes sobre o configurações adequadas para utilização do sistema em base de dados Microsoft SQLServer, visando melhorias de performance. Em diversos momentos você poderá ser redirecionado para execução de processos que já estão descritos na Documentação da Tecnologia.
Importante
Verifique configurações pertinentes a comunicação com banco de dados também descritas no artigo ERP - Performance/Lentidão/Travamentos - Quais são as orientações gerais para otimização de Performance (configurações dentro do SeniorConfigCenter).
Atenção
- As alterações de eventuais parâmetros do banco de dados descritas neste artigo devem ser executada com acompanhamento do DBA da sua empresa e a recomendação é que essas alterações sejam realizadas em ambiente de Homologação para prévia validação e que sejam replicadas em ambiente de Produção mediante validação de janela de alteração adequada com o seu ambiente/volume de dados. As alterações podem ser realizadas em momentos separados, ou seja, não é obrigatório que todos os parâmetros que não estejam corretos sejam alterados ao mesmo tempo;
- É obrigatória a execução de backup da base de dados pelo DBA antes da execução de qualquer processo descrito neste artigo.
1. Parâmetro READ_COMMITED_SNAPSHOT (Isolation Level)
Este parâmetro deve estar habilitado obrigatoriamente
Para maiores informações sobre a configuração, clique aqui para acessar a documentação.
Explicação breve sobre READ_COMMITED_SNAPSHOT (Isolation Level)
Isolation Level é o recurso que define o controle de acesso multiusuário à base de dados. O comportamento do banco de dados Microsoft SQLServer para controle de acesso multi-usuário é:
em uma transação de alteração os dados são travados tanto para alteração quanto para
leitura de outras instâncias (conexões). Essa característica é funcional mas não é a mais
indicada para os sistemas Senior. A característica com maior benefício para os sistemas
Senior é a leitura de dados mesmo que estes dados estejam sendo alterados por outra instância que esteja em transação, os dados são apresentados no estado em que estavam antes de a outra instância abrir a transação. Por este motivo o parâmetro READ_COMMITTED_SNAPSHOT deve estar habilitado, pois é a opção para que o isolation level READ_COMMITED funcione criando SNAPSHOTs a nível de comandos.
Para que verificar o estado atual do parâmetro e também ativá-lo, verifique as informações abaixo.
1.1. Para verificar se o parâmetro está habilitado, execute o select abaixo:
SELECT NAME, IS_READ_COMMITTED_SNAPSHOT_ON FROM SYS.DATABASES;
Caso o retorno do comando seja igual a 1 quer dizer que o parâmetro está devidamente ativado.
Caso o retorno do comando seja igual a 0 quer dizer que o parâmetro está desativado, e deve haver ação do DBA da sua empresa.
1.2. Para ativar o parâmetro, execute o comando indicado abaixo:
Importante
A ativação deste parâmetro deverá ser realizada pelo DBA da sua empresa e dependerá da reinicialização de todo o ambiente dos sistemas para ter efeito.
ALTER DATABASE <DATABASE_NAME> SET READ_COMMITTED_SNAPSHOT ON
2. Parâmetro LOCK ESCALATION
O parâmetro LOCK ESCALATION deve estar desabilitado para todas as tabelas do banco de dados.
Para maiores informações sobre a configuração, clique aqui para acessar a documentação.
Esta é uma configuração realizada a nível de tabela de cada base de dados.
Para que verificar o estado atual do parâmetro e também desativá-lo, verifique as informações abaixo.
2.1. Para verificar se o parâmetro está habilitado, execute o select abaixo:
SELECT NAME, LOCK_ESCALATION, LOCK_ESCALATION_DESC FROM SYS.TABLES WHERE LOCK_ESCALATION=0;
Importante
O comando acima está filtrando explicitamente apenas tabelas onde o Lock Escalation esteja ativado. Então se houver retorno de alguma tabela no comando, quer dizer que existe ação a ser realizada. Ou seja:
- Caso o parâmetro LOCK_ESCALATION seja igual a 1 para a tabela quer dizer que o parâmetro está devidamente desativado (o que está correto).
- Caso o parâmetro LOCK_ESCALATION seja igual a 0 quer dizer que o parâmetro está ativado, e deve haver ação do DBA da sua empresa.
2.2. Para desativar o parâmetro, execute o processo indicado abaixo pelo CBDS;
Importante
- A ativação deste parâmetro deverá ser realizada por um profissional que conheça rotinas do CBDS acompanhada pelo DBA da sua empresa e dependerá da reinicialização de todo o ambiente dos sistemas para ter efeito/
- O processo deve ser executado com todos os usuários deslogados do sistema. Se necessário, utilize o assinalamento de base em Manutenção do CBDS. Clique aqui para acessar a documentação dessa funcionalidade;
- Clique aqui para acessar a documentação do CBDS sobre a rotina de Lock Escalation do CBDS.
2.2.1. Acesse o CBDS;
2.2.2. Acione o menu Arquivo / Conectar;
2.2.3. Selecione o arquivo de Configuração da base de dados onde você realizará;
2.2.4. Na tela de Login, selecione a 'Forma de Logon' como 'Logon no banco de dados' e digite a senha do usuário do banco de dados:
2.2.5. Após realizar o Login, acesse o menu Ferramentas / Recursos de Banco / Lock Escalation das Tabelas:
2.2.6. Verifique para que todas as tabelas estejam listadas do lado esquerdo da tela (na parte de 'Lock Escalation Desabilitado para'), conforme exemplo abaixo:
2.2.7. Ao mover as tabelas para a seção correta, clique em OK. Será exibida a mensagem Tem certeza que deseja alterar as configurações? Você deve clicar na opção 'Sim'. Neste momento será executada a alteração do parâmetro nas tabelas do banco de dados selecionadas.
Importante
O procedimento será aplicado apenas para tabelas que constam dentro do TBS do sistema. Caso na sua empresa tenha sido criada alguma tabela na base de dados que não tenha sido adicionada no TBS, você deverá acionar o DBA da sua empresa para que ele possa fazer tratativa manualmente diretamente no banco de dados para desativar o Lock Escalation para essas tabelas de forma manual.
3. Índices Clusterizados
Para utilização dos sistemas Senior de Tecnologia G5/G6 com performance ideal, é necessário que os índices estejam clusterizados no Microsoft SQLServer. Verifique abaixo os passos para ativar os índices clusterizados através do CBDS.
Atenção
- Para realização desse processo você deve possuir acompanhamento do DBA da sua empresa;
- Antes da realização desse processo em ambiente de Produção, você deve validar estimativa de execução do processo em ambiente de Homologação, para validar a janela de indisponibilidade do sistema;
- É obrigatória a execução de backup da base de dados pelo DBA antes da execução desse processo.
- O processo deve ser executado com todos os usuários deslogados do sistema. Se necessário, utilize o assinalamento de base em Manutenção do CBDS. Clique aqui para acessar a documentação dessa funcionalidade;
- Clique aqui para acessar a documentação do CBDS sobre a rotina de índices clusterizados.
3.1. Acesse o CBDS;
3.2. Acione o menu Arquivo / Conectar;
3.3. Selecione o arquivo de Configuração da base de dados onde você realizará;
3.4. Na tela de Login, selecione a 'Forma de Logon' como 'Logon no banco de dados' e digite a senha do usuário do banco de dados:
3.5. Após realizar o Login, acesse o menu Ferramentas / Recursos de Banco / Tabelas com chave primaria clustered:
3.6. Verifique para que todas as tabelas estejam listadas do lado esquerdo da tela (na parte de 'Clustered'), conforme exemplo abaixo:
3.7. Ao mover alguma tabela para a seção 'Clustered', clique em OK. Ao terminar o procedimento será exibida a mensagem É necessário recriar índices e chaves primárias para aplicar as configurações, conforme imagem abaixo:
3.8. Para recriar índices e chaves primárias, execute os passos abaixo:
3.8.1. Acesse a opção Ferramentas / Alterar Tabela... no CBDS;
3.8.1.1. Selecione todas para execução do processo, movendo as tabelas para a seção 'Tabelas selecionadas'
3.8.1.2. Você deve executar o comando 'Apagar' com o destino 'Executar no banco' para as três opções indicadas abaixo. O botão Processar da tela confirma a execução do processo.
Sequência da execução dos tipos de Objetos:
- Primeiro: Índices;
- Segundo: Relacionamentos;
- Terceiro: Chaves Primárias.
Atenção
- Você deverá executar três vezes o processo 'Apagar' com o destino 'Executar no banco', uma vez para cada tipo de 'Objeto';
- A execução deve ser obrigatoriamente na sequência indicada acima. Do contrário, haverá erros na execução.
Exemplo das execuções:
Índices
Relacionamentos
Chave primária
3.8.2. Agora que os objetos foram excluídos, você deve executar o processo de criação para cada um dos objetos excluídos. Esse processo continua sendo executado através do menu Ferramentas / Alterar Tabela... no CBDS;
3.8.2.1. Selecione todas para execução do processo, movendo as tabelas para a seção 'Tabelas selecionadas':
3.8.2.2. Você deve executar o comando 'Criar' com o destino 'Executar no banco' para as três opções indicadas abaixo. O botão Processar da tela confirma a execução do processo.
Sequência da execução dos tipos de Objetos:
- Primeiro: Chaves Primárias;
- Segundo: Relacionamentos;
- Terceiro: Índices.
Atenção
- Você deverá executar três vezes o processo 'Criar' com o destino 'Executar no banco', uma vez para cada tipo de 'Objeto';
- A execução deve ser obrigatoriamente na sequência indicada acima. Do contrário, haverá erros na execução. Note que a execução de 'Criar' é na ordem contrária da execução de 'Apagar';
Exemplo das execuções:
Chaves primárias
Relacionamentos
Índices
3.8.3. Após a realização do processo de apagar e criar os objetivos, realize a consistência de base através do menu Ferramentas / Consistir Base...
4. Fragmentação de Indices
A fragmentação de índices muito grande pode trazer perda de performance para as rotinas do banco de dados e consequentemente para o sistema.
Abaixo segue um exemplo de comando para verificar a fragmentação dos índices de tabelas que possuam mais de 1000 linhas.
Você deve alterar o trecho NOME_BASE pelo nome da base de dados do sistema onde você deseja fazer a análise de fragmentação.
Importante
Tome cuidado para escrever o nome da base em letras maiúsculas.
SELECT dbschemas.[name] as 'Schema',
dbtables.[name] as 'Table',
dbindexes.[name] as 'Index',
indexstats.avg_fragmentation_in_percent,
indexstats.page_count
FROM sys.dm_db_index_physical_stats (DB_ID(), NULL, NULL, NULL, NULL) AS indexstats
INNER JOIN sys.tables dbtables on dbtables.[object_id] = indexstats.[object_id]
INNER JOIN sys.schemas dbschemas on dbtables.[schema_id] = dbschemas.[schema_id]
INNER JOIN sys.indexes AS dbindexes ON dbindexes.[object_id] = indexstats.[object_id]
AND indexstats.index_id = dbindexes.index_id
WHERE indexstats.database_id = DB_ID('NOME_BASE')
and dbindexes.[name] is not null and page_count > 1000
ORDER BY indexstats.avg_fragmentation_in_percent desc, indexstats.page_count desc
Importante
Um valor acima de 4% de fragmentação é um valor alto e a desfragmentação deve ser realizada pelo DBA da sua empresa.
5. Coleta de Estatísticas
A coleta de estatísticas é um processo regular que deve ser executado no banco de dados.
Esse processo deve ser configurado pelo DBA da sua empresa, seguindo as recomendações da Senior.
Importante
Em casos de tratativas de situações relacionadas a Performance/lentidão/Travamentos, você deve sempre solicitar evidência ao seu DBA de que a rotina de coleta de estatísticas está sendo efetuada semanalmente e enviar essas evidências sempre que solicitado pelo Suporte da Senior.
Observação
Para mais informações sobre o questões relacionadas a Performance/Lentidão/Travamentos do Gestão Empresarial | ERP, consulte o artigo ERP - Performance/Lentidão/Travamentos - Onde é possível encontrar informações diversas sobre questões relacionadas a Performance/Lentidão/Travamentos (índice).
Atenção! Antes de realizar qualquer alteração, analise o impacto que poderá ter em outros lançamentos/processos do sistema.