Vi recentemente a pergunta "onde 1 = 1 afirmação" ; uma construção SQL que tenho usado frequentemente na construção de SQL dinâmico, em um esforço para escrever um código mais limpo (da perspectiva da linguagem host).
De um modo geral, essa adição a uma declaração SQL afeta negativamente o desempenho da consulta? Não estou procurando uma resposta em relação a um sistema de banco de dados específico (porque eu o usei no DB2, SQL Server, MS-Access e mysql) - a menos que seja impossível responder sem entrar em detalhes.
performance
optimization
transistor1
fonte
fonte
1=1
WHILE 1=1
cláusula. No entanto, parece não ter nenhum impacto detectável no tempo de execução.Respostas:
Todos os principais RDBMS, tanto quanto eu sei, construíram avaliações constantes. Isso deve avaliar praticamente instantaneamente em qualquer um deles.
fonte
De uma perspectiva do SQL Server, se você estiver fazendo isso
WHERE 1=1
para permitir a passagem dinâmica de parâmetros e ignorando a avaliação de um parâmetro, sugiro que você leia alguns artigos do Erland Sommarskog, MV do SQL Server. Sua abordagem elimina a necessidade de fazer outros truques dentro do SQL dinâmico (como aWHERE Column = Column
construção ou o uso de umaWHERE (Col = Val OR 1=1) and (Col2 = Val2 OR 1=1)
construção). O 1 = 1 não deve causar problemas de desempenho, como o @JNK mencionou (marquei a resposta dele lá e essa é a que deve ser aceita), acho que você encontrará algumas boas dicas no artigo de Erland sobre SQL dinâmico e você também verá que ele ainda usa esse1=1
para os casos em que nenhum parâmetro é passado, mas ele os evita para parâmetros individuais que não são passados, ele simplesmente não 'fonte
Com o MySQL, você pode verificar, executando EXPLAIN EXTENDED e, posteriormente, SHOW WARNINGS para ver a consulta real. tl; dr: fica otimizado.
fonte
In older MySQL releases, extended information was produced using EXPLAIN EXTENDED. That syntax is still recognized for backward compatibility but extended output is now enabled by default, so the EXTENDED keyword is superfluous and deprecated. Its use results in a warning, and it will be removed from EXPLAIN syntax in a future MySQL release.
foi removido no MySQL v 8.0.