Разница в производительности для COALESCE по сравнению с ISNULL?

Я видел, как многие люди используют функцию COALESCE вместо ISNULL. Из интернет-поиска я обнаружил, что COALESCE является стандартом ANSI, поэтому есть преимущество, что мы знаем, чего ожидать при его использовании. Однако ISNULL кажется более легким для чтения, поскольку кажется более понятным, что он делает.

Я также понимаю, что ISNULL является довольно сложным, поскольку он действует по-разному на разных серверах баз данных и на разных языках.

Все это, на мой взгляд, сводится к стилю и стандартам. Учитывая, что стиль субъективен, есть ли причина использовать COALESCE над ISNULL (или наоборот)? В частности, есть ли преимущество в производительности одного над другим?

43 голоса | спросил Richard 3 PM00000060000001831 2011, 18:10:18

3 ответа


23

COALESCE внутренне переводится в выражение CASE, ISNULL - это внутренняя функция движка. COALESCE - стандартная функция ANSI, ISNULL - это T-SQL. Различия в производительности могут и возникают, когда выбор влияет на план выполнения, но разница в скорости сырой функции минимальна.

ответил Mark Storey-Smith 3 PM00000060000001631 2011, 18:27:16
35
  • ISNULL - это спецификация Sybase /SQL Server
  • COALESCE переносится

Тогда

  • ISNULL принимает 2 аргумента
  • COALESCE принимает 1-n аргументы

Наконец, и забавный бит. Тип данных результата и длина /точность /масштаб

Этот последний бит - это то, почему ISNULL обычно используется, потому что он более предсказуем (?), а COALESCE может добавлять непреднамеренные преобразования типа данных: где бит «это медленнее» происходит от

  DECLARE @ len10 varchar (10); - удалить его NULL
ВЫБРАТЬ
    ISNULL (@ len10, '0123456789ABCDEF'), - дает 0123456789
    COALESCE (@ len10, '0123456789ABCDEF'); - дает 0123456789ABCDEF
 

Все типы данных одинаковы, вы не увидите никакой практической разницы ...

ответил gbn 3 PM00000070000004031 2011, 19:25:40
19

Как отметил Марк, вам будет трудно найти различия в производительности; Я думаю, что другие факторы будут более важными. Для меня I always использует COALESCE, и большинство из них уже упоминалось вами или Mark:

  • COALESCE - стандарт ANSI. Это еще одна вещь, о которой мне нужно беспокоиться, если я собираюсь передать свой код. Для меня лично это не так важно, потому что я знаю, как редко такие порты фактически происходят вне мира классной комнаты Celko, но для некоторых людей это преимущество.
  • В отличие от того, что вы сказали о читаемости, я считаю, что это может быть сложнее читать ISNULL, особенно для пользователей, поступающих с других языков или платформ, где ISNULL возвращает логическое значение (которого нет в SQL Server ). Конечно, COALESCE сложнее писать, но, по крайней мере, это не приводит к неправильным предположениям.
  • COALESCE намного более гибкий, так как я могу сказать COALESCE (a, b, c, d), тогда как с ISNULL мне нужно будет сделать много гнездования для достижения того же самого.

Вы также должны быть уверены, что знаете, как обрабатывается приоритет типа данных с использованием двух функций, если вы используете его с разными типами данных /точностью и т. д.

Примечание

Есть одно исключение. В текущих версиях SQL Server они обрабатываются по-разному:

  SELECT COALESCE ((SELECT some_aggregate_query), 0);

SELECT ISNULL ((SELECT some_aggregate_query), 0);
 

Вариант COALESCE будет фактически выполнять some_aggregate_query дважды (один раз, чтобы проверить значение, и один раз, чтобы вернуть его, когда ненулевой), а ISNULL выполнит только один подзапрос. Я говорю о нескольких других различиях:

ответил Aaron Bertrand 3 PM00000060000003431 2011, 18:45:34

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132