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 / 155650
Accepted
ErikE
ErikE
Asked: 2016-11-18 14:39:48 +0800 CST2016-11-18 14:39:48 +0800 CST 2016-11-18 14:39:48 +0800 CST

Fonte autoritativa que <> e != são idênticas em desempenho no SQL Server

  • 772

Considere esta resposta no SO que tranquiliza o questionador sobre o <>operador que:

<>é ... o mesmo que !=.

Mas então um comentarista se intromete e diz:

É verdade que eles são, funcionalmente, os mesmos. No entanto, como o otimizador SQL os usa é muito diferente. =/!= são simplesmente avaliados como verdadeiro/falso, enquanto <> significa que o mecanismo precisa verificar se o valor é maior ou menor, o que significa mais sobrecarga de desempenho. Apenas algo a considerar ao escrever consultas que podem ser caras.

Estou confiante de que isso é falso, mas, para abordar os céticos em potencial, me pergunto se alguém pode fornecer uma fonte autorizada ou canônica para provar que esses operadores não são apenas funcionalmente iguais, mas idênticos em todos os aspectos.

sql-server performance
  • 4 4 respostas
  • 17469 Views

4 respostas

  • Voted
  1. Best Answer
    Paul White
    2016-11-18T21:44:02+08:002016-11-18T21:44:02+08:00

    Durante a análise , o SQL Server chama sqllang!DecodeCompOppara determinar o tipo de operador de comparação presente:

    pilha de chamadas

    Isso ocorre bem antes de qualquer coisa no otimizador se envolver.

    De operadores de comparação (Transact-SQL)

    Operadores de comparação e significados

    Rastreando o código usando um depurador e símbolos públicos*, sqllang!DecodeCompOpretorna um valor no registrador eax** da seguinte forma:

    ╔════╦══════╗
    ║ Op ║ Code ║
    ╠════╬══════╣
    ║ <  ║    1 ║
    ║ =  ║    2 ║
    ║ <= ║    3 ║
    ║ !> ║    3 ║
    ║ >  ║    4 ║
    ║ <> ║    5 ║
    ║ != ║    5 ║
    ║ >= ║    6 ║
    ║ !< ║    6 ║
    ╚════╩══════╝
    

    !=e <>ambos retornam 5, então são indistinguíveis em todas as operações posteriores (incluindo compilação e otimização).


    Embora secundário ao ponto acima, também é possível (por exemplo, usando o sinalizador de rastreamento não documentado 8605) examinar a árvore lógica passada para o otimizador para confirmar que ambos mapeiam para !=( não é igual à comparação do operador escalar).<>ScaOp_Comp x_cmpNe

    Por exemplo:

    SELECT P.ProductID FROM Production.Product AS P
    WHERE P.ProductID != 4
    OPTION (QUERYTRACEON 3604, QUERYTRACEON 8605);
    
    SELECT P.ProductID FROM Production.Product AS P
    WHERE P.ProductID <> 4
    OPTION (QUERYTRACEON 3604, QUERYTRACEON 8605);
    

    ambos produzem:

    LogOp_Project QCOL: [P].ProductID
        LogOp_Select
            LogOp_Get TBL: Production.Product(alias TBL: P)
            ScaOp_Comp x_cmpNe
                ScaOp_Identifier QCOL: [P].ProductID
                ScaOp_Const TI(int,ML=4) XVAR(int,Não possui,Valor=4)
        AncOp_PrjList
    

    notas de rodapé

    * Eu uso o WinDbg ; outros depuradores estão disponíveis. Os símbolos públicos estão disponíveis através do servidor de símbolos normal da Microsoft. Para obter mais informações, consulte Olhando mais profundamente no SQL Server usando Minidumps pela equipe de consultoria do cliente do SQL Server e Depuração do SQL Server com WinDbg – uma introdução de Klaus Aschenbrenner.

    ** O uso de EAX em derivados da Intel de 32 bits para valores de retorno de uma função é comum. Certamente o Win32 ABI faz dessa maneira, e tenho certeza que herda essa prática dos velhos tempos do MS-DOS, onde o AX era usado para o mesmo propósito - Michael Kjörling

    • 176
  2. stacylaray
    2016-11-18T19:22:33+08:002016-11-18T19:22:33+08:00

    Trabalho na Microsoft com suporte SQL e perguntei a Jack Li, engenheiro sênior de escalonamento e especialista no assunto de desempenho do SQL Server: "O SQL trata != de maneira diferente de <> ?" e ele disse: "Eles são os mesmos."

    • 65
  3. a1ex07
    2016-11-18T16:29:54+08:002016-11-18T16:29:54+08:00

    Acho que o seguinte prova que <>não faz 2 comparações.

    1. SQL Standard 92 define <>como operador diferente, ( http://www.contrib.andrew.cmu.edu/~shadow/sql/sql1992.txt ). Tecnicamente, !=é uma extensão do padrão (embora eu não consiga pensar em nenhum RDBMS que não o implemente).
    2. Se o SQLServer tratasse <>como 2 operadores, não um, faria o mesmo para o ><qual é de fato um erro de sintaxe.
    • 8
  4. Ryan Cooper
    2016-12-01T09:49:42+08:002016-12-01T09:49:42+08:00

    Isso está incorreto, Books Online (BOL) diz que eles são funcionalmente iguais:

    != (Não é igual a) (Transact-SQL)

    E se você olhar para um plano de execução onde !=é usado, em Predicado, ele muda != para <>.

    • 2

relate perguntas

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

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

  • Onde posso encontrar o log lento do mysql?

  • Como posso otimizar um mysqldump de um banco de dados grande?

Sidebar

Stats

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

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

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

    • 4 respostas
  • Marko Smith

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

    • 10 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
  • Martin Hope
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +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

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