6
votes

T-SQL Isnull () Optimisation

J'ai cette clause sur une jointure dans une procédure stockée que j'ai héritée:

WHERE a.is_active = 1
AND b.due_date <= ISNULL(@due_date_limit, b.due_date)


0 commentaires

7 Réponses :


3
votes
AND @due_date_limit IS NULL OR b.due_date <= @due_date_limit
but I'm not so sure it would be that much faster.

1 commentaires

Un index n'est pas une préoccupation - même si l'on existait, l'index ne serait utilisé que dans la 2ème moitié. C'est bien mieux que les suggestions Isnull / Coalise.



7
votes

Dans ce cas, j'aurais une instruction IF, vérifiant @Due_date_limit xxx


0 commentaires

1
votes

@Due_date_limit est une variable de procédure stockée afin qu'elle puisse être pratiquée à partir de cette requête toutes ensemble: xxx


0 commentaires

1
votes
COALESCE(@due_date_limit, b.due_date)
may help

1 commentaires

Cela gérera les choses gracieusement, mais c'est un gaspillage pour effectuer un équivalent 1 = 1.



2
votes

Y a-t-il un index sur dus_date? Si vous n'en ajoutez pas, vérifiez la performance. S'il y a déjà, alors changez à deux instructions distinctes xxx

mais réalisez que non filtrant (lorsque @Due_date_limit est null) ou filtrage à l'aide d'un <= peut potentiellement retourner un nombre substantiel d'enregistrements qui Éliminera toute possibilité d'utiliser un index et nécessitera une analyse de table complète. Cela peut être ce que vous vivez.


0 commentaires

3
votes

La cause la plus courante de performances médiocres avec ce type de requête est que l'optimiseur ne peut pas être sûr de la valeur typique de @Due_Date_limit pour la plupart des requêtes. Souvent, le plan généré et réutilisé par des exécutions ultérieures favorise le cas où la valeur est null.

AS de SQL 2005, vous pouvez guider l'optimiseur à l'aide de l'option "Optimiser" pour ": - P>

WHERE a.is_active = 1
AND b.due_date <= ISNULL(@due_date_limit, b.due_date)
OPTION (OPTIMIZE FOR (@due_date_limit = '09/01/2009'))


1 commentaires

Si le paramètre est NULL, pourquoi voudriez-vous toujours comparer des valeurs? Vous ne l'utilisez pas, alors n'utilisez pas Isnull / Foalisece pour les paramètres facultatifs.



0
votes

Etant donné que @Due_date_limit code> est une variable de procédure stockée, vous pouvez simplement le vérifier pour null code> avant la requête et la définir sur une valeur par défaut si nécessaire, éliminez ainsi le Isnull check in the où code> clause. xxx pré>

, puis votre où la clause code> ressemblerait simplement à ceci: p>

WHERE a.is_active = 1
AND b.due_date <= @due_date_limit


1 commentaires

La réponse d'Astander est une solution meilleure si vous en avez besoin pour être identique à la même chose que l'enregistrement de colonne pour répondre à la condition de l'opérateur <= , définie sinon si la requête comme celle-ci puisqu'elle sera plus rapide et il n'y a pas de Chèque.