Как отметил Марк, вам будет сложно найти различия в производительности; Я думаю, что другие факторы будут более важными. Для меня я всегда использую COALESCE, и большая часть этого уже упоминалась вами или Марком:
- 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
только выполнить подзапрос один раз. Я говорю о некоторых других различиях здесь:
COALESCE
оценивается дважды.