Banco de Dados

13 nov, 2009

Dicas para uma boa performance em seus códigos T-SQL

Publicidade

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.