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)
7 Réponses :
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.
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.
Dans ce cas, j'aurais une instruction IF, vérifiant @Due_date_limit
@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:
COALESCE(@due_date_limit, b.due_date) may help
Cela gérera les choses gracieusement, mais c'est un gaspillage pour effectuer un équivalent 1 = 1.
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 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. P> p>
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'))
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.
Etant donné que , puis votre @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.
où la clause code> ressemblerait simplement à ceci: p>
WHERE a.is_active = 1
AND b.due_date <= @due_date_limit
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 <= code>, définie sinon si la requête comme celle-ci puisqu'elle sera plus rapide et il n'y a pas de Chèque.