Início > SQL Server - Performance > 10 pontos que devem ser observados quanto a performance de uma consulta Parte 2

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…

Anúncios
  1. Antonio Alex
    28 de junho de 2008 às 12:03

    Muito boa estas dicas, tambem gosto muito desta area de performance!!!Valeu!Antonio Alex

  2. Thiago Alencar
    3 de dezembro de 2010 às 13:32

    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

  3. 31 de janeiro de 2011 às 13:39

    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!

  1. No trackbacks yet.

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

%d blogueiros gostam disto: