Recientemente vi la pregunta "donde 1 = 1 declaración" ; Una construcción SQL que he usado a menudo para construir SQL dinámico en un esfuerzo por escribir código más limpio (desde la perspectiva del lenguaje anfitrión).
En términos generales, ¿esta adición a una declaración SQL afecta negativamente el rendimiento de la consulta? No estoy buscando una respuesta con respecto a un sistema de base de datos específico (porque lo he usado en DB2, SQL Server, MS-Access y mysql), a menos que sea imposible responder sin entrar en detalles.
performance
optimization
transistor1
fuente
fuente
1=1
WHILE 1=1
cláusula. Sin embargo, no parece tener ningún impacto detectable en el tiempo de ejecución.Respuestas:
Todos los principales RDBMS, que yo sepa, han incorporado evaluaciones constantes. Esto debería evaluarse casi instantáneamente en cualquiera de ellos.
fuente
Desde una perspectiva de SQL Server, si está haciendo lo
WHERE 1=1
posible para permitir el paso dinámico de parámetros y omitir la evaluación de un parámetro, le sugiero que lea un par de artículos del MV de SQL Server Erland Sommarskog. Su enfoque elimina la necesidad de hacer otros trucos dentro del SQL dinámico (como laWHERE Column = Column
construcción o el uso de unaWHERE (Col = Val OR 1=1) and (Col2 = Val2 OR 1=1)
construcción). El 1 = 1 no debería causar problemas de rendimiento como mencionó @JNK (he hecho +1 en su respuesta allí y esa es la que debería aceptarse), creo que encontrará algunos buenos consejos del artículo de Erland sobre SQL dinámico y también verá que todavía usa el1=1
de los casos en los que no se pasan parámetros, pero los evita para los parámetros individuales que no se pasan, simplemente nofuente
Con MySQL, puede verificar, ejecutando EXPLAIN EXTENDED y luego SHOW WARNINGS para ver la consulta real. tl; dr: se optimiza lejos.
fuente
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.
se eliminó en MySQL v 8.0.