Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

L'encapsulation de colonnes nullables dans ISNULL provoque-t-elle des analyses de table ?

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