2009-07-01 9 views
5

Estoy trabajando con un cliente que inicia casi todas sus cláusulas WHERE en Oracle con 1=1. Perdona mi ignorancia, pero ¿no es esto una no-operación? ¿Hay alguna consecuencia negativa de este uso?En Oracle, ¿está comenzando la cláusula WHERE de SQL Query con 1 = 1 útil?

Aquí está un ejemplo fregado:

SELECT gpz.zname 
     ,gpp.pname 
FROM  table1 gpp INNER JOIN table2 gpz ON gpz.p_id = gpp.p_id 
WHERE 1=1 
     AND gpp.active = 1 
     AND gpz.active = 1 

Respuesta

18

Está hecho para simplificar la generación de SQL dinámico. Básicamente, cada condición se puede agregar como AND <condition> sin tratar la primera condición como especial (está precedida por WHERE no AND) o incluso preocupante si debe haber una cláusula WHERE en absoluto.

Así que simplemente anótelo como fácil de usar o, posiblemente, como flojera.

+1

+1 para la pereza, la simplificación de la PL/SQL por una o dos líneas e infligir este tipo de SQL en la base de datos es bastante pobre. Es una lástima si por alguna razón necesitan establecer cursor_sharing = FORCE - no estoy seguro, pero creo que CBO se enfrentará con "WHERE: 1 =: 2 AND ..." ¡y lo optimizará en consecuencia! Sé interesante para averiguar ... –

+0

Sospeché que este era el caso. Este cliente realmente tiene consultas no dinámicas como esta también. Son realmente vagos :) – Blanthor

+0

@JeffreyKemp Según [T-SQL 1 = 1 Performance Hit] (http://stackoverflow.com/q/1049512), el DBMS no tiene un impacto en el rendimiento al usar este patrón. –

0

Es posible que hayan creado la consulta a partir de subcadenas.

Puede ser una manera de compilarlo con tan solo AND s, dependiendo de la coincidencia de la regla de negocios, por lo que realmente no tiene que preocuparse de cuál es su primera condición.

No lo haría de esa manera yo mismo.

3

Si están creando dinámicamente la consulta, debe comprobar si están utilizando variables de vinculación. Crear la consulta a partir de literales requiere un análisis adicional, lo que puede limitar la escalabilidad, y también puede aumentar en gran medida el riesgo de ataques de inyección SQL.

where 1 = 1 and my_id = :b1; 

(y luego definir el valor de la variable bind)

es generalmente mucho mejor que:

where 1 = 1 and my_id = 123456; 
Cuestiones relacionadas