quarta-feira, 12 de agosto de 2009

Aumentando a performance através da otimização de SQL.

Olá, como primeira matéria deste blog, vamos discuir sobre otimização do sql server. Vou tentar reunir detalhadamente tudo aquilo que pode ajudar a melhorar a performance em nossos servidores de banco de dados, para começar vou apresentar as principais características e posteriormente vou entrar em detalhes mais específicos.

1- Modelagem do Banco de Dados:Uma má performance geralmente é resultado de uma modelagem ruim.
2- Tuning de Aplicação:Quase 80% dos problemas de performance em banco de dados são causados por códigos SQL mal elaborados. Reduzir o tempo dos SQL e o custo é importantíssimo para eliminarmos uma boa porcentagem desses problemas.
3- Tuning de Memória:Defina corretamente o buffer do Banco de Dados (shared_pool, buffer cache, log buffer, etc.), observando o buffer hit ratios. Coloque os objetos grandes e muito acessados em memória para prevenir freqüentes reloads.
4- Tuning de I/O Físico:Arquivos de Banco de Dados precisam estar com o tamanho correto e em um local que prove um mínimo de I/O. Verifique também freqüentes sorts de disco, full table scans, falta de índices, row chaining, fragmentação de dados, etc.
5- Elimine Contenção de Dados:Estude os eventos que acontecem no banco relativo à locks, latches e wait com cuidado e elimine-os quando possível. Um dos principais gargalos que acabamos ignorando é o tempdb, ele é responsável por:

-Criação e exclusão de tabelas temporárias, sejam elas globais (##TABLE) ou locais #TABLE),
-Operações que utilizam CURSORES,
-Operações que utilizam ORDER BY ou GROUP BY,
-Operações que utilizam HASH PLAN,
-Variáveis do tipo tabela que utilizam o TEMPDB para armazenamento temporário de informações.

Como o TEMPDB armazena apenas objetos temporários e todos estes objetos são excluídos assim que a conexão do usuário é fechada, não existe necessidade de se fazer backup desta base, mesmo porque, o TEMPDB é recriado a cada vez que o SQL Server é reiniciado, gerando assim uma cópia novinha do banco de dados.Por padrão, o TEMPDB é expandido automaticamente durante a utilização do SQL Server para suportar a carga de processamento do sistema. Mas, diferente dos outros bancos de dados, ele tem seu tamanho reduzido ao valor inicial a cada vez que o SQL Server é reiniciado.O grande problema é que em um ambiente onde o TEMPDB é altamente utilizado, o SQL Server pode sofrer problemas de contenção quando ele tenta alocar páginas para novos objetos. Dependendo do grau de contenção, o SQL Server pode até parar de responder por alguns minutos.

Otimas práticas para melhorar a cotenção no tempdb:

Colocar um tamanho inicial do TempDB adequado
Costumo definir um tamanho inicial do TempDB maior do que o padrão (nas minhas instalações coloco 1,5GB). Se utilizarmos o tamanho padrão (8MB), toda vez que houver uma forte utilização do TempDB, ele irá "perder tempo" crescendo para acomodar a transação e posteriormente reduzindo o seu tamanho para o tamanho original. Esse movimento de crescimento e redução é prejudicial e por isso prefiro já colocar um tamanho grande para evitar esses dois movimentos.

Criar um arquivo de dados adicional para cada processador
Se o servidor possuir múltiplos processadores, cada processador pode disparar uma Thread para gravação e leitura em paralelo. Dessa forma, se possuo um servidor com 8 processadores, pode ser útil criar mais 7 arquivos no TempDB para que cada processador possa disparar uma Thread para cada arquivo. Se os sistemas são de altíssima concorrência, essa recomendação não terá efeito já que os processadores estarão muito ocupados para que todos ao mesmo tempo dediquem-se ao TempDB. No entanto, no momento em que ninguém estiver usando o sistema e houver uma carga que use objetos temporários, isso pode fazer diferença já que os processadores deverão estar mais dedicados.

6 -Tuning de Sistema Operacional:Monitore e defina com cuidado os parâmetros de CPU, I/O e memória de forma a melhorar a performance do Banco.


Até mais...

Diogo Pettres

Um comentário:

  1. Parabens Diogo! Esta primeira postagem sobre otimização ficou muito boa!

    Abraços
    Rodrigo

    ResponderExcluir