Leistungsunterschied zwischen COALESCE und ISNULL?

48

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?

Richard
quelle
1
In keiner der Antworten wird erwähnt, dass eine Unterabfrage in a COALESCE zweimal ausgewertet wird.
Martin Smith
4
"ISNULL scheint leichter zu lesen zu sein, da es klarer zu sein scheint, was es tut" - wirklich? Ich finde den Namen nicht intuitiv: Ich würde erwarten, dass er einen Booleschen Wert zurückgibt, der angibt, ob ein Ausdruck in null oder unbekannt aufgelöst wurde. Der Name COALESCEist nur uninteressant;)
18.04.12

Antworten:

40
  • ISNULL ist Sybase / SQL Server-spezifisch
  • COALESCE ist portabel

Dann

  • ISNULL nimmt 2 Argumente an
  • COALESCE akzeptiert 1-n Argumente

Endlich und das lustige Stück. Der Ergebnisdatentyp und die Länge / Genauigkeit / Skalierung

  • ISNULL ist dasselbe wie das erste Argument
  • COALESCE ist die höchste Priorität nach Datentyp

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"

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 ...

gbn
quelle
22

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:

  • COALESCE ist ANSI-Standard. Es ist eine Sache weniger, über die ich mir Sorgen machen muss, wenn ich meinen Code portieren will. Für mich persönlich ist das nicht so wichtig, weil ich weiß, wie selten solche Ports außerhalb von Celkos Klassenraumwelt vorkommen, aber für manche Menschen ist dies ein Vorteil.
  • Im Gegensatz zu dem, was Sie über die Lesbarkeit gesagt haben, kann es schwieriger sein , ISNULL zu lesen, insbesondere für Benutzer, die aus anderen Sprachen oder Plattformen stammen, auf denen ISNULL einen Booleschen Wert zurückgibt (der in SQL Server nicht vorhanden ist). Zugegeben, COALESCE ist schwerer zu buchstabieren, führt aber zumindest nicht zu falschen Annahmen.
  • COALESCE ist viel flexibler, wie ich sagen kann, COALESCE (a, b, c, d), während ich mit ISNULL viel schachteln müsste, um dasselbe zu erreichen.

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:

SELECT COALESCE((SELECT some_aggregate_query),0); 

SELECT ISNULL((SELECT some_aggregate_query),0); 

Die COALESCEVariante wird tatsächlich some_aggregate_queryzweimal ausgeführt (einmal, um den Wert zu überprüfen, und einmal, um ihn zurückzugeben, wenn er nicht Null ist), während ISNULLdie Unterabfrage nur einmal ausgeführt wird. Ich spreche hier über ein paar andere Unterschiede:

Aaron Bertrand
quelle