Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

O encapsulamento de colunas anuláveis ​​em ISNULL causa varreduras de tabela?


Sim, causa varreduras de tabela. (embora pareça ser otimizado se a coluna não for realmente anulável)

O SR0007 A regra é um conselho geral extremamente ruim, pois torna o predicado inargável e significa que quaisquer índices na coluna serão inúteis. Mesmo que não haja índice na coluna, isso ainda pode tornar as estimativas de cardinalidade imprecisas, afetando outras partes do plano.

A categorização dele no Microsoft.Performance A categoria é bastante divertida, pois parece ter sido escrita por alguém sem compreensão do desempenho da consulta.

Afirma que a razão é

Embora a expressão em si seja avaliada como unknown seu código retorna um resultado completamente determinístico quando você entende que qualquer = , <> , > , < etc comparação com NULL avaliar como Unknown e que o WHERE cláusula retorna apenas linhas onde a expressão é avaliada como true .

É possível que eles signifiquem se ANSI_NULLS está desligado, mas o exemplo que eles dão na documentação de WHERE ISNULL([c2],0) > 2; vs WHERE [c2] > 2; não seria afetado por esta configuração de qualquer maneira. Esta configuração

Planos de execução mostrando varreduras versus busca ou abaixo
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