none
IsNull - Aplicação em clausula Where RRS feed

  • Pergunta

  • Olá pessoal,

     

    Tenho um script que está assim:

     

    Code Snippet

    Declare

    @Campo1 int,

    @Campo2 varchar(50),

    @Campo3 varchar(50)

     

    Select Campo1,Campo2,Campo3

    From Tabela1 inner join Tabela2 on Tabela1.Campo1=Tabela2.Campo1

    Where

    Campo1=isnull(@Campo1,Campo1) and

    Campo2=isnull(@Campo2,Campo2) and

    Campo3=isnull(@Campo3,Campo3)

     

     

    Notei que o fato de usar o isnull na clausula where acarreta em um Clutered Index Scan

     

    Bom, certamente terei problemas em um qtde muito grande de registros, mesmo setando um valor qq para a variável @Campo1. O meu problema é que preciso que a cláusula retorne o valor do campo mesmo q as variáveis estejam null, da mesma forma que o exemplo acima, mas gostaria de tentar resolver o problema do Clustered Scan.

     

    Alguma sugestão?

     

    quarta-feira, 5 de setembro de 2007 19:46

Todas as Respostas

  • Rick,

     

    Mas um Clustered Index Scan, representa que o SQL Server esta fazendo uma busca sobre o seu índice clusterizado.

     

    É melhor ocorrer um index scan, ao invês de um table scan, com certeza o table scan é muito pior.

    quarta-feira, 5 de setembro de 2007 20:00
  • Então, no curso que fiz, lembro-me de o professor ter falado que um Clutered Index Scan é pior que um Table Scan, tem algo a ver com página de dados e o engine do SQL, mas não lembro tecnicamente o motivo, pelo que me lembro a diferença é muito pequena de um para o outro, vou dar uma olhada na apostila, acho que é na do 2073. E obviamente, as vezes o que vem escrito na apostila pode estar mesmo errado.

     

    De qualquer forma o que estou fazendo usando o isnull não é o ideal certo? pois quando retiro o isnull aparece somente Clustered Index Seek. Bom, eu vou ter cerca de 4milhões de registros, não deve ter uma performance muito ruim mesmo com scan, só queria deixar certinho.

    quarta-feira, 5 de setembro de 2007 20:17
  •  

    Senhores,

     

    Vamos com calma, hehe. Seguinte, um Clustered Index Scan, representa que o SQL está percorrendo a ordem física como os dados estão gravados. Isso não quer dizer que seja pior que um Table Scan. Geralmente o Table Scan é feito na falta de índices aos quais recorrer. Quando você tiver uma chave primária com Clustered Index, e não tiver qualquer outro índice que seja bom para a consulta, ele vai usar o Clustered Index!!

     

    MAS, é melhor quando temos um Non-Clustered index definido sobre as colunas usadas no WHERE para que tenha um melhor desempenho.

     

    Bom, pra ser sincero, essa é uma questão para uma bela conversa de horas... Não é algo muito simples, mas espero ter ajudado.

     

     

     

    Abraço

    quarta-feira, 5 de setembro de 2007 20:49
  • Eu fiz um IF, então caso o usuario especifique o código eu uso um select sem o "isnull", se ele não digitar nada aí sim, uso o isnull.

     

    Não é o ideal, mas ja vai fazer uma diferença grande.

    quinta-feira, 6 de setembro de 2007 16:16
  •  

    E aí Rick,

     

     

    Eu não gosto muito de usar IFs em códigos SQL, pois isso vai ser um desvio de código, podendo causar o não reaproveitamento dos planos de execução.

     

    Mas, se ficou melhor assim, deixa assim.

     

     

    Abraço

    quinta-feira, 6 de setembro de 2007 16:30