Ich habe viele Leute gesehen, die die COALESCE-Funktion anstelle von ISNULL verwenden. Bei der Suche im Internet habe ich festgestellt, dass COALESCE der ANSI-Standard ist. Daher gibt es einen Vorteil, bei dem wir wissen, was uns bei der Verwendung erwartet. ISNULL scheint jedoch einfacher zu lesen zu sein, da es klarer zu sein scheint, was es tut.
Mir ist auch klar, dass ISNULL etwas knifflig ist, da es auf verschiedenen Datenbankservern und in verschiedenen Sprachen unterschiedlich funktioniert.
All das läuft meiner Meinung nach auf Stil und Maßstäbe hinaus. Gibt es bei subjektivem Stil einen Grund, COALESCE anstelle von ISNULL zu verwenden (oder umgekehrt)? Gibt es einen Leistungsvorteil gegenüber dem anderen?
sql-server
syntax
Richard
quelle
quelle
COALESCE
zweimal ausgewertet wird.COALESCE
ist nur uninteressant;)Antworten:
COALESCE
wird intern in einenCASE
Ausdruck übersetzt,ISNULL
ist eine interne Engine-Funktion.COALESCE
ist eine ANSI-Standardfunktion,ISNULL
ist T-SQL.Leistungsunterschiede können und müssen auftreten, wenn die Auswahl den Ausführungsplan beeinflusst, der Unterschied in der Geschwindigkeit der Rohfunktion jedoch winzig ist .
quelle
Dann
Endlich und das lustige Stück. Der Ergebnisdatentyp und die Länge / Genauigkeit / Skalierung
Das letzte Bit ist der Grund, warum ISNULL normalerweise verwendet wird, weil es vorhersehbarer ist (?) Und COALESCE unbeabsichtigte Datentypkonvertierungen hinzufügen kann. Daher kommt das Bit "Es ist langsamer"
Da alle Datentypen gleich sind, werden Sie keinen praktischen Unterschied feststellen ...
quelle
Wie Mark betonte, wird es Ihnen schwer fallen, Leistungsunterschiede zu finden. Ich denke, andere Faktoren werden wichtiger sein. Für mich benutze ich immer COALESCE, und das meiste davon haben Sie oder Mark bereits erwähnt:
Sie sollten sich auch darüber im Klaren sein, wie die Vorrangstellung von Datentypen mithilfe der beiden Funktionen gehandhabt wird, wenn Sie sie mit unterschiedlichen Datentypen / -präzisionen usw. verwenden.
Hinweis
Es gibt eine Ausnahme. Diese werden in aktuellen Versionen von SQL Server unterschiedlich behandelt:
Die
COALESCE
Variante wird tatsächlichsome_aggregate_query
zweimal ausgeführt (einmal, um den Wert zu überprüfen, und einmal, um ihn zurückzugeben, wenn er nicht Null ist), währendISNULL
die Unterabfrage nur einmal ausgeführt wird. Ich spreche hier über ein paar andere Unterschiede:quelle