He estado batallando con este por un tiempo. Tengo un proceso almacenado que toma en 3 parámetros que se utilizan para filtrar. Si se transfiere un valor específico, quiero filtrarlo. Si se pasa -1, dame todo.T-SQL Donde Cláusula Case Statement Optimization (parámetros opcionales para StoredProc)
lo he probado las dos formas siguientes:
Primera forma:
SELECT field1, field2...etc
FROM my_view
WHERE
parm1 = CASE WHEN @PARM1= -1 THEN parm1 ELSE @PARM1 END
AND parm2 = CASE WHEN @PARM2 = -1 THEN parm2 ELSE @PARM2 END
AND parm3 = CASE WHEN @PARM3 = -1 THEN parm3 ELSE @PARM3 END
segunda manera:
SELECT field1, field2...etc
FROM my_view
WHERE
(@PARM1 = -1 OR parm1 = @PARM1)
AND (@PARM2 = -1 OR parm2 = @PARM2)
AND (@PARM3 = -1 OR parm3 = @PARM3)
leí en alguna parte que la segunda manera lo hará corto circuito y nunca evalúa la segunda parte si es verdadero. Mi DBA dijo que obliga a una exploración de tabla. No he verificado esto, pero parece ser más lento en algunos casos.
La tabla principal desde la que se selecciona esta vista tiene alrededor de 1,5 millones de registros, y la vista procede a unirse a otras 15 tablas para recopilar mucha otra información.
Ambos métodos son lentos ... llevándome de 2 segundos a 40 segundos, lo que en mi situación es completamente inaceptable.
¿Existe una forma mejor que no implique dividirla en cada caso específico de vs específico?
Cualquier ayuda es apreciada. Gracias.
Maldición. Pásame a eso. +1 :) – DVK
La primera opción no necesariamente arrojará los mismos resultados que la segunda. Si tiene filas en su tabla con valores NULL, NO serán devueltas por la consulta de "opción 1". Por ejemplo ... Seleccione * De la tabla donde NullableColumn = NullableColumn –
Los tres parms NO son NULL, por lo que no es un problema en este caso. Parece que podría estar atascado con la opción 1. – IronicMuffin