Oui, cela provoque des analyses de table. (bien que semble être optimisé si la colonne n'est pas réellement nullable)
Le SR0007 La règle est un conseil général extrêmement médiocre car elle rend le prédicat insécable et signifie que tous les index sur la colonne seront inutiles. Même s'il n'y a pas d'index sur la colonne, cela peut encore rendre les estimations de cardinalité inexactes affectant d'autres parties du plan.
La catégorisation de celui-ci dans le Microsoft.Performance
la catégorie est assez amusante car elle semble avoir été écrite par quelqu'un qui n'a aucune compréhension des performances des requêtes.
Il prétend que la justification est
Alors que l'expression elle-même est évaluée à unknown
votre code renvoie un résultat complètement déterministe une fois que vous comprenez que tout =
, <>
, >
, <
etc comparaison avec NULL
évaluer comme Unknown
et que le WHERE
la clause ne renvoie que les lignes où l'expression est évaluée à true
.
Il est possible qu'ils signifient si ANSI_NULLS
est désactivé mais l'exemple qu'ils donnent dans la documentation de WHERE ISNULL([c2],0) > 2;
vs WHERE [c2] > 2;
ne serait de toute façon pas affecté par ce paramètre. Ce paramètre
Plans d'exécution montrant les analyses par rapport à la recherche ou en dessous
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