10 pontos que devem ser observados quanto a performance de uma consulta Parte 2
3. Sempre que possível substituir condições com OR por UNION ALL, por ex:
SET NOCOUNT ON GO IF OBJECT_ID(‘Teste ‘) IS NOT NULL DROP TABLE Teste GO CREATE TABLE Teste (ID Int Identity(1,1), CPF Char(11), Nome VarChar(200), Sobrenome VarChar(200), Endereco VarChar(200), Bairro VarChar(200), Cidade VarChar(200)) GO — Inclui 1000 mil de linhas na tabela INSERT INTO Teste(CPF, Nome, SobreNome, Endereco, Bairro, Cidade) VALUES(‘11111111111’, NEWID(), ‘Neves Amorim’, NEWID(), NEWID(), NEWID()) GO 1000
CREATE CLUSTERED INDEX ix_ID ON Teste(ID) GO CREATE INDEX ix_Nome ON Teste(Nome) GO
/* Seleciona todos os registros onde ID = 10 ou então o Nome inicia com 38. Esta consulta irá gerar um Scan na tabela pois o OR impede que o SQL use o ix_ID ou o ix_Nome. */ SELECT * FROM Teste WHERE ID = 10 OR Nome Like ‘38%’ GO
/* A instrução acima deve ser trocada por a consulta abaixo que utiliza o UNION ALL */ SELECT Tab.* FROM (SELECT * FROM Teste WHERE ID = 10 UNION ALL SELECT * FROM Teste WHERE Nome Like ‘38%’) AS Tab |
Obs.: Sempre que possível utilize “UNION ALL” ao invés de “UNION” pois o “UNION” gera um distinct que geralmente gera um order by o que irá gerar um custo desnecessário comparado a concatenação do “UNION ALL”.
Continua…
Muito boa estas dicas, tambem gosto muito desta area de performance!!!Valeu!Antonio Alex
Tmb curto muita a area de performance. Fabiano, por favor! Escreva mais conteudos sobre o assunto. Esse é um ponto crucial para o DBA e o Desenvolvedor
Estou com problemas aqui na empresa com uma procedure que tem 579 linhas.
Existem várias Functions e vários Joins. E Union All.
Ela está demorando de 2 à 5 minutos para executar. É um absurdo.
Quero melhorar isso ;D
Se você puder me ajudar Fabiano! ;D
Estou indo para o próximo Post!