COALESCE vs IS NOT NULL performances sur le contrôle chaîne vide
Question
Quelques articles que j'ai trouvé sur internet ISNULL par rapport à COALESCE, donc je pense que ma question est un peu différent.
Je me demande ce qui est mieux en termes de performance
SELECT * FROM mytable WHERE mycolumn IS NOT NULL AND mycolumn <> '';
ou
SELECT * FROM mytable WHERE COALESCE(mycolumn,'') <> '';
autres que la performance, sont-il d'autres préoccupations que je dois prendre en considération au moment de décider?
EDIT:
J'utilise Teradata.
La solution
Cette version est un peu plus sargable et permet un indice d'être (potentiellement) utilisé
SELECT * FROM mytable WHERE mycolumn IS NOT NULL AND mycolumn <> '';
Il peut être simplifié à
SELECT * FROM mytable WHERE mycolumn <> '';
La raison pour laquelle je dis « un peu » et « potentiellement » est que le prédicat non d'égalité peut bien signifier que vous finissez avec une analyse complète de toute façon.
Autres conseils
Vous pouvez également envisager d'utiliser le ANSI_NULL ON Réglage . Cela va filtrer implicitement des valeurs NULL sur une colonne où vous émettez un argument de recherche. Faire cela simplifie votre requête, je ne sais pas si elle le rend plus rapide. Logiquement, en théorie, il devrait cependant, puisque les arguments moins de filtre doivent être évalués et aucune fonction sont utilisées dans la clause where qui devrait permettre la sélectivité de l'index complet. À titre d'exemple, vous pouvez re-facteur votre requête comme ceci:
SET ANSI_NULLS ON;
SELECT * FROM mytable WHERE NOT mycolumn = '';
J'espère que cette aide.