Sí, causa escaneos de tablas. (aunque parece optimizarse si la columna no admite valores NULL)
El SR0007 La regla es un consejo general extremadamente pobre, ya que hace que el predicado no se pueda analizar y significa que cualquier índice en la columna será inútil. Incluso si no hay un índice en la columna, es posible que las estimaciones de cardinalidad sean inexactas y que afecten a otras partes del plan.
La categorización del mismo en el Microsoft.Performance
La categoría es bastante divertida, ya que parece haber sido escrita por alguien que no comprende el rendimiento de las consultas.
Afirma que la razón es
Mientras que la expresión en sí se evalúa como unknown
su código devuelve un resultado completamente determinista una vez que comprende que cualquier =
, <>
, >
, <
etc comparación con NULL
evaluar como Unknown
y que el WHERE
la cláusula solo devuelve filas donde la expresión se evalúa como true
.
Es posible que se refieran a si ANSI_NULLS
está apagado pero el ejemplo que dan en la documentación de WHERE ISNULL([c2],0) > 2;
vs WHERE [c2] > 2;
no se vería afectado por esta configuración de todos modos. Esta configuración
Planes de ejecución que muestran escaneos frente a búsqueda o menos
CREATE TABLE #foo
(
x INT NULL UNIQUE
)
INSERT INTO #foo
SELECT ROW_NUMBER() OVER (ORDER BY @@SPID)
FROM sys.all_columns
SELECT *
FROM #foo
WHERE ISNULL(x, 10) = 10
SELECT *
FROM #foo
WHERE x = 10
SELECT *
FROM #foo
WHERE x = 10
OR x IS NULL