Uma consulta WHERE fará verificações em comparações mais simples (por exemplo, bit) antes de executar comparações mais árduas (por exemplo, varchar)?

12

Se eu escrever uma consulta que inclua uma WHEREcláusula composta , por exemplo:

SELECT *
FROM MyTable
WHERE BitField = 1
    AND VarcharField = 'asdf'

e a inclusão dessa bitcomparação simplesmente exclui os mesmos campos que a varcharcomparação excluirá; a presença dessa bitcomparação de campos me renderá uma melhoria de desempenho?

andrewb
fonte

Respostas:

22

É importante reconhecer que o SQL é uma linguagem declarativa. A SELECTconsulta que você escreveu especifica os resultados lógicos que devem ser retornados. Cabe ao mecanismo do banco de dados, especificamente o otimizador de consulta, determinar uma estratégia física eficiente para retornar esses resultados.

O plano final de execução física dependerá das habilidades de raciocínio do otimizador, da quantidade de tempo que ele está preparado para gastar no problema, da disponibilidade de métodos de acesso adequados (principalmente índices e visualizações materializadas), informações estatísticas representativas e o caminho de código específico a especificação da consulta passa pelo código de otimização.

Em geral, se o design do seu banco de dados é relacional, você fornece bons métodos de acesso e informações estatísticas precisas e a consulta é bem escrita, o otimizador normalmente encontrará uma estratégia de execução física razoável, sem que você precise se preocupar muito com a forma escrita de a especificação da consulta em excesso.

Sempre haverá casos em que a expressão do mesmo requisito lógico usando sintaxe diferente (mas semanticamente idêntica) afetará o plano de execução físico, mas isso deve ser uma preocupação secundária. Novamente, geralmente, considere expressar a consulta de maneira diferente se as características de tempo de execução forem inaceitáveis, uma vez que todos os princípios mencionados acima tenham sido abordados.

Seria raro ao extremo a ordem escrita de WHEREpredicados de cláusulas conjuntivas simples (como na pergunta) afetar o plano de execução física de qualquer maneira mensurável. Em suma, isso não é algo com que você deva se preocupar. Obtenha o design do banco de dados, índices e informações estatísticas primeiro.

Para responder à pergunta diretamente (eventualmente!), Adicionar uma condição extra redundante pode melhorar o desempenho, mas apenas se ele permitir o uso de um método de acesso mais eficiente - por exemplo, se houver apenas um índice (BitField, VarcharField). Se já houvesse um índice em (VarcharField), ele adicionaria apenas sobrecarga.

Como um detalhe de implementação, não, o SQL Server não considera o custo das comparações, dependendo do tipo de dados ou da complexidade computacional aparente. De fato, há um custo muito baixo e precioso das operações escalares , mas isso leva a um tópico inteiro.

Perguntas relacionadas:

Operadores lógicos OU AND na condição e ordem das condições no WHERE
SQL Server 2008 e expressões constantes
Operadores bit a bit que afetam o desempenho
Comportamento estranho da instrução SQL

Paul White 9
fonte
5

Partições binárias (como uma coluna de bits) soam como boas candidatas a índices filtrados.

CREATE NONCLUSTERED INDEX MyTableWithBitFieldTrue
ON MyTable (VarcharField)
INCLUDE Id, <other columns you're selecting>
WHERE BitField = 1 ;
GO

Ser explícito sobre suas otimizações significa que seu código é mais robusto em relação às alterações de outras pessoas, seja na sua base de código ou no SQL Server.

Greg
fonte