Ich habe gesehen, dass viele Leute die COALESCE-Funktion anstelle von ISNULL verwenden. Bei der Suche im Internet habe ich festgestellt, dass COALESCE ANSI-Standard ist. Daher haben wir den Vorteil, dass wir wissen, was uns bei der Verwendung erwartet. ISNULL scheint jedoch einfacher zu lesen zu sein, da 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 Standards hinaus. Gibt es angesichts des subjektiven Stils einen Grund, COALESCE über ISNULL zu verwenden (oder umgekehrt)? Gibt es insbesondere einen Leistungsvorteil gegenüber dem anderen?
COALESCE
wird intern in einen CASE
Ausdruck übersetzt, ISNULL
ist eine interne Engine-Funktion.
COALESCE
ist eine ANSI-Standardfunktion, ISNULL
ist T-SQL.
Leistungsunterschiede können und können auftreten, wenn die Auswahl den Ausführungsplan beeinflusst, aber der Unterschied in der Geschwindigkeit der Rohfunktion ist winzig .
Dann
Endlich und das lustige bisschen. Der Ergebnisdatentyp und die Länge/Genauigkeit/Skalierung
Dieses 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"
DECLARE @len10 varchar(10); --leave it NULL
SELECT
ISNULL(@len10, '0123456789ABCDEF'), -- gives 0123456789
COALESCE(@len10, '0123456789ABCDEF'); -- gives 0123456789ABCDEF
Da alle Datentypen gleich sind, werden Sie keinen praktischen Unterschied feststellen ...
Wie Mark betonte, wird es Ihnen schwer fallen, Leistungsunterschiede zu finden. Ich denke, andere Faktoren werden wichtiger sein. Für mich immer benutze COALESCE, und das meiste davon wurde bereits von dir oder Mark erwähnt:
Sie sollten auch sicher sein, dass Sie wissen, wie die Priorität von Datentypen mithilfe der beiden Funktionen behandelt 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:
SELECT COALESCE((SELECT some_aggregate_query),0);
SELECT ISNULL((SELECT some_aggregate_query),0);
Die Variante COALESCE
führt tatsächlich some_aggregate_query
zweimal (einmal, um den Wert zu überprüfen, und einmal, um ihn zurückzugeben, wenn er nicht Null ist), während ISNULL
die Unterabfrage nur einmal ausführt. Ich spreche hier über einige andere Unterschiede: