Widziałem wiele osób korzystających z funkcji COALESCE zamiast ISNULL. Z wyszukiwarek internetowych dowiedziałem się, że COALESCE jest standardem ANSI, więc mamy tę zaletę, że wiemy, czego się spodziewać podczas jego używania. Jednak ISNULL wydaje się łatwiejszy do odczytania, ponieważ wydaje się bardziej jasne, co robi.
Zdaję sobie również sprawę, że ISNULL jest dość trudny, ponieważ działa inaczej na różnych serwerach baz danych i w różnych językach.
Wszystko to, moim zdaniem, sprowadza się do stylu i standardów. Biorąc pod uwagę, że styl jest subiektywny, czy jest jakiś powód, aby używać COALESCE zamiast ISNULL (lub odwrotnie)? W szczególności, czy istnieje przewaga wydajności jednego nad drugim?
sql-server
syntax
Richard
źródło
źródło
COALESCE
ocenie jest oceniane dwukrotnie.COALESCE
jest po prostu nieintuicyjna;)Odpowiedzi:
COALESCE
jest wewnętrznie przetłumaczony naCASE
wyrażenie,ISNULL
jest wewnętrzną funkcją silnika.COALESCE
to standardowa funkcja ANSI,ISNULL
to T-SQL.Różnice w wydajności mogą powstać, gdy wybór wpływa na plan wykonania, ale różnica w szybkości funkcji pierwotnej jest niewielka .
źródło
Następnie
Wreszcie i trochę zabawy. Wynikowy typ danych i długość / precyzja / skala
Ten ostatni bit jest zwykle używany ISNULL, ponieważ jest bardziej przewidywalny (?), A COALESCE może dodawać niezamierzone konwersje typów danych: stąd pochodzi bit „jest wolniejszy”
Wszystkie typy danych są takie same, nie zobaczysz żadnej praktycznej różnicy ...
źródło
Jak zauważył Mark, ciężko będzie znaleźć różnice w wydajności; Myślę, że inne czynniki będą ważniejsze. Dla mnie zawsze używam COALESCE, a większość z nich została już wspomniana przez Ciebie lub Marka:
Należy również upewnić się, że użytkownik jest świadomy sposobu, w jaki pierwszeństwo typu danych jest obsługiwane przy użyciu dwóch funkcji, jeśli jest używany z różnymi typami danych / dokładnościami itp.
Uwaga
Jest jeden wyjątek. Są obsługiwane inaczej w bieżących wersjach SQL Server:
COALESCE
Wariant będzie faktycznie wykonaćsome_aggregate_query
dwa razy (raz, aby sprawdzić wartość, a raz wrócić, gdy non-zero), podczas gdyISNULL
wykona tylko raz podzapytania. Mówię tutaj o kilku innych różnicach:źródło