sql >> Base de Datos >  >> RDS >> Sqlserver

¿Envolver columnas anulables en ISNULL causa escaneos de tablas?

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