AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 5333
Accepted
garik
garik
Asked: 2011-09-02 23:40:13 +0800 CST2011-09-02 23:40:13 +0800 CST 2011-09-02 23:40:13 +0800 CST

Operadores lógicos OR E em condição e ordem de condições em WHERE

  • 772

Vamos examinar essas duas afirmações:

IF (CONDITION 1) OR (CONDITION 2)
...

IF (CONDITION 3) AND (CONDITION 4)
...

Se CONDITION 1for TRUE, será CONDITION 2verificado?
Se CONDITION 3for FALSE, será CONDITION 4verificado?

E as condições em WHERE: o mecanismo do SQL Server otimiza todas as condições em uma WHEREcláusula? Os programadores devem colocar as condições na ordem correta 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 de divisão por zero neste caso.

CONCLUSÃO:

Se C++/C#/VB tem curto-circuito, por que o SQL Server não pode ter?

Para realmente responder a isso, vamos dar uma olhada em como ambos funcionam com condições. C++/C#/VB todos têm curto-circuito definido nas especificações da linguagem para acelerar a execução do código. Por que se preocupar em avaliar condições N OR quando a primeira já é verdadeira ou condições M AND quando a primeira já é falsa.

Nós, como desenvolvedores, temos que estar cientes de que o SQL Server funciona de maneira diferente. É um sistema baseado em custos. Para obter o plano de execução ideal para nossa consulta, o processador de consulta deve avaliar todas as condições e atribuir um custo. Esses custos são então avaliados como um todo para formar um limite que deve ser inferior ao limite definido que o SQL Server tem para um bom plano. Se o custo for inferior ao limite definido, o plano é usado, caso contrário, todo o processo é repetido novamente com uma combinação diferente de custos de condição. O custo aqui é uma varredura ou uma busca ou uma junção de mesclagem ou uma 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 um curto-circuito, mas não é. Apenas força o uso desse índice e com isso encurta 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 faz curto-circuito como é feito em outras linguagens de programação e não há nada que você possa fazer para forçá-lo.

sql-server sql-server-2008
  • 5 5 respostas
  • 147203 Views

5 respostas

  • Voted
  1. Best Answer
    MicSim
    2011-09-03T00:03:21+08:002011-09-03T00:03:21+08:00

    Não há garantia no SQL Server se ou em que ordem as instruções serão processadas em uma WHEREcláusula. A única expressão que permite o curto-circuito da instrução é CASE- WHEN. O seguinte é de uma resposta que postei no Stackoverflow:

    Como o SQL Server causa um curto-circuito na avaliação da condição WHERE

    Acontece quando parece, mas não da maneira que você pensa imediatamente.

    Como desenvolvedor, você deve estar ciente de que o SQL Server não faz curto-circuito como é feito em outras linguagens de programação e não há nada que você possa fazer para forçá-lo a .

    Para mais detalhes, verifique o primeiro link na entrada do blog acima, que está levando a outro blog:

    O SQL Server faz curto-circuito?

    O veredicto final? Bem, eu realmente não tenho um ainda, mas provavelmente é seguro dizer que a única vez que você pode garantir um curto-circuito específico é quando você expressa várias condições WHEN em uma expressão CASE. Com expressões booleanas padrão, o otimizador moverá as coisas como achar melhor com base nas tabelas, índices e dados que você está consultando.

    • 29
  2. Jack Douglas
    2011-09-03T02:23:06+08:002011-09-03T02:23:06+08:00

    No T-SQL, a IFinstrução pode entrar em curto-circuito, mas você não pode confiar nela avaliando as expressões em ordem

    • 8
  3. jitbit
    2019-06-18T04:17:45+08:002019-06-18T04:17:45+08:00

    SQL é uma linguagem de programação declarativa . Ao contrário, digamos, C++, que é uma linguagem de programação imperativa .

    Ou seja, você pode dizer o que deseja no resultado final, mas não pode ditar como o resultado está sendo executado, tudo depende do mecanismo.

    A única maneira verdadeira de garantir "curto-circuito" (ou qualquer outro fluxo de controle ) dentro WHEREé usar exibições indexadas, tabelas temporárias e mecanismos semelhantes.

    PS. Você também pode usar dicas de plano de execução (para "sugerir" ao mecanismo como executar uma consulta, quais índices usar e COMO usá-los), apenas pensei que deveria mencioná-lo, enquanto estamos neste tópico ...

    • 1
  4. mrdenny
    2011-09-10T23:53:52+08:002011-09-10T23:53:52+08:00

    A única maneira de controlar como as condições dentro da cláusula WHERE é usar colchetes para agrupá-las.

    WHERE Col1 = 'Something' AND Col2 = 'Something' OR Col3 = 'Something' and Col4 = 'Something'
    

    é muito diferente de

    WHERE (Col1 = 'Something' AND Col2 = 'Something') OR (Col3 = 'Something' and Col4 = 'Something')
    
    • -3
  5. Ranjith Kumar
    2011-09-10T13:28:11+08:002011-09-10T13:28:11+08:00

    1)--OU (qualquer uma ou ambas as condições serão TRUE)

    se a condição 1 for TRUE, a condição 2 também será verificada, pode ser TRUE ou FALSE

    --AND (ambas as condições devem ser TRUE)

    se a condição 1 for FALSE então a condição 2 não será verificada

    • -4

relate perguntas

  • Quais são as principais causas de deadlocks e podem ser evitadas?

  • Quanto "Padding" coloco em meus índices?

  • Existe um processo do tipo "práticas recomendadas" para os desenvolvedores seguirem para alterações no banco de dados?

  • Como determinar se um Índice é necessário ou necessário

  • Downgrade do SQL Server 2008 para 2005

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Como você mostra o SQL em execução em um banco de dados Oracle?

    • 2 respostas
  • Marko Smith

    Como selecionar a primeira linha de cada grupo?

    • 6 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Posso ver Consultas Históricas executadas em um banco de dados SQL Server?

    • 6 respostas
  • Marko Smith

    Como uso currval() no PostgreSQL para obter o último id inserido?

    • 10 respostas
  • Marko Smith

    Como executar o psql no Mac OS X?

    • 11 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Marko Smith

    Passando parâmetros de array para um procedimento armazenado

    • 12 respostas
  • Martin Hope
    Manuel Leduc Restrição exclusiva de várias colunas do PostgreSQL e valores NULL 2011-12-28 01:10:21 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Stuart Blackler Quando uma chave primária deve ser declarada sem cluster? 2011-11-11 13:31:59 +0800 CST
  • Martin Hope
    pedrosanta Listar os privilégios do banco de dados usando o psql 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST
  • Martin Hope
    BrunoLM Guid vs INT - Qual é melhor como chave primária? 2011-01-05 23:46:34 +0800 CST
  • Martin Hope
    bernd_k Quando devo usar uma restrição exclusiva em vez de um índice exclusivo? 2011-01-05 02:32:27 +0800 CST
  • Martin Hope
    Patrick Como posso otimizar um mysqldump de um banco de dados grande? 2011-01-04 13:13:48 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve