Vamos examinar estas duas declarações:
IF (CONDITION 1) OR (CONDITION 2)
...
IF (CONDITION 3) AND (CONDITION 4)
...
Se CONDITION 1
for TRUE
, será CONDITION 2
verificado?
Se CONDITION 3
for FALSE
, será CONDITION 4
verificado?
E as condições em WHERE
: o mecanismo do SQL Server otimiza todas as condições em uma WHERE
cláusula? Os programadores devem colocar as condições na ordem certa para garantir que o otimizador do SQL Server as resolva da maneira correta ?
ADICIONADO:
Obrigado a Jack pelo link, surpresa do código t-sql:
IF 1/0 = 1 OR 1 = 1
SELECT 'True' AS result
ELSE
SELECT 'False' AS result
IF 1/0 = 1 AND 1 = 0
SELECT 'True' AS result
ELSE
SELECT 'False' AS result
Não há uma exceção Dividir por zero neste caso.
CONCLUSÃO:
Se C ++ / C # / VB está em curto-circuito, por que o SQL Server não pode ter?
Para realmente responder a isso, vamos dar uma olhada em como os dois trabalham com as condições. Todos os C ++ / C # / VB possuem curto-circuito definido nas especificações de linguagem para acelerar a execução do código. Por que se preocupar em avaliar as condições N OU quando o primeiro já é verdadeiro ou M e condições quando o primeiro já é falso.
Nós, como desenvolvedores, precisamos estar cientes de que o SQL Server funciona de maneira diferente. É um sistema baseado em custo. Para obter o plano de execução ideal para nossa consulta, o processador de consultas deve avaliar todas as condições where e atribuir um custo a ela. Esses custos são então avaliados como um todo para formar um limite que deve ser menor que o limite definido que o SQL Server possui para um bom plano. Se o custo for menor que o limite definido, o plano será usado; se não, todo o processo será repetido novamente com uma combinação diferente de custos de condição. O custo aqui é uma junção de varredura, busca ou mesclagem ou junção de hash, etc ... Por causa disso, o curto-circuito disponível em C ++ / C # / VB simplesmente não é possível. Você pode pensar que forçar o uso de índice em uma coluna conta como curto-circuito, mas não. Isso força apenas o uso desse índice e, com isso, reduz a lista de possíveis planos de execução. O sistema ainda é baseado em custos.
Como desenvolvedor, você deve estar ciente de que o SQL Server não provoca curto-circuito, como é feito em outras linguagens de programação e não há nada que você possa fazer para forçá-lo.