it-swarm.com.de

Leistungsunterschied zwischen COALESCE und ISNULL?

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?

51
Richard

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 .

28
  • ISNULL ist Sybase/SQL Server-spezifisch
  • COALESCE ist tragbar

Dann

  • ISNULL nehmen 2 Argumente
  • COALESCE akzeptiert 1-n Argumente

Endlich und das lustige bisschen. Der Ergebnisdatentyp und die Länge/Genauigkeit/Skalierung

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

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

42
gbn

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:

  • 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 tatsächlich außerhalb von Celkos Unterrichtswelt 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 aus anderen Sprachen oder Plattformen, auf denen ISNULL einen Booleschen Wert zurückgibt ( die in SQL Server nicht existiert). Zugegeben, COALESCE ist schwerer zu buchstabieren, führt aber zumindest nicht zu falschen Annahmen.
  • COALESCE ist viel flexibler, wie ich COALESCE (a, b, c, d) sagen kann, während ich mit ISNULL viel verschachteln müsste, um dasselbe zu erreichen.

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:

24
Aaron Bertrand