Что быстрее COALESCE ИЛИ ISNULL? - PullRequest
25 голосов
/ 18 февраля 2010

Я понимаю разницу между этими функциями, но мой вопрос заключается в том, что при проверке единственного нулевого значения ISNULL будет быстрее, чем при использовании COALESCE?

* 1003 например *

COALESCE(SELECT TOP 1 SomeValue FROM SomeTable, 0)

против

ISNULL(SELECT TOP 1 SomeValue FROM SomeTable, 0)

Ответы [ 6 ]

13 голосов
/ 18 февраля 2010

Я быстро взглянул на это, так как интересно увидеть ряд различных сравнений производительности на уровне 2. Я думаю, что это сообщение в блоге Адама Мачанича является наиболее точным в тесте производительности.по этой теме, где нижняя строка равна:

... и ISNULL, по-видимому, довольно стабильно превосходят COALESCE в среднем на 10 или 12 процентов

ОднакоЯ разделяю ту же точку зрения, что и то, что он затем говорит, - что разница довольно незначительна - например, в его тестах миллион выполнений показал в среднем разницу в 0,7 с.Стоит ли оно того?Я бы предположил, что есть, вероятно, большие области для оптимизации.Но прочитайте статью, она хороша для чтения.

7 голосов
/ 16 июля 2014

В этом случае ISNULL - лучший вариант. Потому что SQL Server интерпретирует функцию COALESCE как оператор CASE. Итак, ваш запрос

COALESCE (ВЫБЕРИТЕ TOP 1 SomeValue FROM SomeTable, 0)

будет записываться SQL Server как

  1. СЛУЧАЙ
  2. КОГДА ( ВЫБРАТЬ ТОП-1 SomeValue ОТ SomeTable ) НЕ НУЛЬ
  3. ТО ( ВЫБРАТЬ ТОП-1 SomeValue ОТ SomeTable )
  4. ELSE 0
  5. END

Если вы соблюдаете вышеприведенную интерпретацию, «SomeTable» будет отсканирован дважды. Но ISNULL будет оцениваться только один раз.

3 голосов
/ 18 февраля 2010

ISNULL будет быстрее, я думаю, потому что он имеет меньшую реализацию функции / кода, что делает его быстрее, чем COALESCE

1 голос
/ 18 февраля 2010

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

  1. ISNULL и COALESCE

  2. Тест скорости вращения ISNULL и COALESCE

  3. Пожалуйста, проверьте производительность : ISNULL против COALESCE

0 голосов
/ 20 ноября 2015

Для чего это стоит У вас есть очень конкретный вариант использования, поэтому я использовал пример вашего фактического вопроса на первом значении в таблице, которая пришла в голову и контролировал скрипт для других переменных. Я предположил, что someval был int как вы использовали 0. Я предлагаю вам выбрать конкретный случай someval / sometable и выполнить тест самостоятельно.

declare @val  int = 0;
declare @time1  Datetime2 = getdate();
declare @time2  Datetime2 = getdate();
Select @time1 = GETDATE();
while @MyCounter < 1000000
Begin
 Select @val = ISNULL((SELECT TOP 1 LocationID FROM location), 0)
 Select @MyCounter +=1;
END
Select @time2 = GETDATE();
Print datediff(millisecond,@time1,@time2);
Select @MyCounter = 0;
Select @time1 = GETDATE();
while @MyCounter < 1000000
Begin
 Select @val = COALESCE((SELECT TOP 1 LocationID FROM Location), 0)
 Select @MyCounter +=1;
END
Select @time2 = GETDATE();
Print datediff(millisecond,@time1,@time2);

Результаты были довольно впечатляющими: 11270 для isnull и 18930 для объединения. Изменение порядка петель в качестве второго теста дало 18260 для объединения и 10810 для полного. Для вашего конкретного случая я бы сказал, что isnull явно быстрее.

Нельзя сказать, что лучше в любой другой данной ситуации. Использование прямых значений или nvarchars или битов вместо int, или столбца, который не является первичным ключом, или Nesting isnull вместо добавления параметров в coalesce может изменить ситуацию.

Это касается только того вопроса, который был задан.

0 голосов
/ 06 ноября 2015

Я только что провёл тест на своем собственном БД.Около 700 тыс. Строк.

SELECT COUNT(*) FROM table WHERE COALESCE(field_1,field_2,field_3,field_4) IS NOT NULL

Результат 12106, полученный за 56 секунд.

SELECT COUNT(*) FROM table WHERE field_1 IS NOT NULL OR field_2 IS NOT NULL OR field_3 IS NOT NULL OR field_4 IS NOT NULL

Результат 12106, полученный за 0,00 секунды.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...