Melhorar a performance nos bancos de dados é sempre algo desejado. Na hora de fazer isso, surgem várias dúvidas de como fazer da melhor forma. Talvez uma das perguntas mais comuns em fóruns seja como melhorar a performance de uma consulta que está muito lenta. Situação que traz uma resposta totalmente aberta: depende! E depende mesmo, de vários fatores. A lista a seguir traz apenas 10 dicas que podem fazer a diferença em seus scripts T-SQL. Espero que ela o ajude a encontrar uma boa solução, mesmo sabendo que os fatores que causam perda de performance precisam ser analisados antes de qualquer ação. Bom proveito!
01. No comando SELECT, utilize apenas o número de colunas que seja necessário
Deve-se evitar a utilização do * para o retorno da consulta. Tudo porque ao
utilizar o * em sua consulta, o SQL consulta a tabela syscolumns para retornar
todas as colunas e agregar a seu comando o resultado.
Exemplo:
SELECT cNome, dNascimento, lAtivo
FROM tbPessoaFisica
02. Não declare variáveis que você não utilizará ou reaproveite variáveis
existentes.
Este procedimento aumenta sua banda de cache, deixando assim, uma
margem extra de cache para outros processos.
03. Utilize CONVERT apenas para conversão de dados do tipo DATETIME
Para as
demais conversões de tipos, utilize CAST, pois CAST faz parte do padrão ANSI-92
e CONVERT funciona apenas para o SQL Server, sendo que em versões futuras este
comando corre o risco de ser cortado do Transact.
Exemplo:
SELECT
CAST(GETDATE() AS VARCHAR(20)) AS dCast,
CONVERT(VARCHAR(20), GETDATE(), 100) AS dConvert
04. Utilize SELECT ao invés de SET
Com apenas um SELECT você pode definir
valores para uma ou mais variáveis, enquanto para o comando SET você precisaria
de vários comandos. Sendo assim, a utilização do comando SELECT para atribuição
de valores a variáveis fica bem mais rápida.
Exemplo:
DECLARE @id AS INT, @nome AS VARCHAR(25), @nascimento AS DATETIME
-- EX de atribuição de valores utilizando SET
SET @id = 10
SET @nome = 'Rodrigo'
SET @nascimento = '1984-02-29'
-- EX de atribuição de valores utilizando SELECT
SELECT @id = 10, @nome = 'Rodrigo', @nascimento = '1984-02-29'
05. Cuidado com ORDER BY e DISTINCT
Use apenas se necessário. A
utilização destes comandos pode gerar sobrecarga no engine do SQL Server,
causando a lentidão no processo ou em processos simultâneos.
06. Utilize as palavras reservadas do transact em letras maiúsculas para se
diferenciar das demais.
Esta dica não influencia no quesito performance do script, mas
ajuda a encontrar possíveis erros de sintaxe logo na escrita. Isto pode aumentar sua produtividade.
Exemplo:
--SEM ERRO
SELECT cNome, dNascimento, lAtivo
FROM tbPessoaFisica
WHERE idPessoaFisica = 10
GO
--COM ERRO
SEELCT cNome, dNascimento, lAtivo
FROM tbPessoaFisica
WHERE idPessoaFisica = 10;
07. SELECT * INTO funciona muito bem para com pequenas tabelas
Mas, ao lidar
com grande número de registro ou longo processo de consulta, pode causar
bloqueios em objetos da base tempDB, ocasionando filas para outros processos
que utilizam a tempDB. Isto ocorre porque, ao criar um objeto, é causado um lock
exclusivo nas tabelas sysobjects e syscolunms. Então, utilize este recurso com cuidado!
08. Utilize variáveis de tabela ao invés de tabelas temporárias
Tabelas
temporárias podem causar recompilações em algumas procedures. Variáveis de
tabelas foram criadas para solucionar este problema de recompilações em
procedures que necessitam de objetos temporários.
09. Clausula WHERE
Os diversos operadores, usados diretamente, afetam no tempo
de resposta de suas consultas. Para conhecer melhor sua proficiência, você pode
ler o artigo disponibilizado pela Microsoft em http://msdn.microsoft.com/en-us/library/ms190276.aspx
10. Utilize a procedure sp_executesql
A utilização da sp_executesql evita
recompilações de procedures. Mas, lembre-se, recompilações nem sempre são ruins.
Para maior informação sobre recompilações e cache de planos de execução, leia o
artigo do TechNet http://technet.microsoft.com/en-us/library/cc966425.aspx
Exemplo:
EXECUTE sp_executesql
N'SELECT cNome, dNascimento, lAtivo FROM tbPessoaFisica
WHERE idPessoaFisica = @idPessoaFisica', N'@idPessoaFisica INT', @idPessoaFisica =
10
É isso aí, pessoal, espero que essas dicas sejam úteis no dia-a-dia de vocês.
Grande abraço e até a próxima.