Почему IsNull в два раза медленнее объединения (тот же запрос)? - PullRequest
5 голосов
/ 27 мая 2011

Мы столкнулись со странной ситуацией в SQL Server 2008 (SP1) - 10.0.2531.0 (X64) - Win2008 SP2 (X64).

Вот один тяжелый запрос:

select t1.id, t2.id 
from t1, t2
where 
     t1.id = t2.ext_id
     and isnull(t1.vchCol1, 'Null') = isnull(t2.vchCol1, 'Null')
     and isnull(t1.vchCol2, 'Null') = isnull(t2.vchCol2, 'Null')
     .... and about 10 more comparisons with Isnull

UPD : все сравниваемые столбцы (кроме идентификаторов) varchar (~ 30 ... 200)
T1 составляет ~ 130 млн строк, T2 составляет ~ 300 тыс. Строк.

Эти запросы на довольно большом Dev-сервере выполняются ~ 5 часов - это медленно, но что мы можем сделать?

И пока мы исследовали возможные пути оптимизации - мы обнаружили, что изменение "isnull" до "coalesce" в приведенном выше запросе дает двойной прирост производительности - и теперь запрос выполняется в течение ~ 2 часов

UPD : когда мы удаляем все ISNULL проверки и используем только t1.vchCol1 = t2.vchCol1, запрос завершается через 40 минут .

Вопрос: : это известное поведение, и мы следует избегать , используя IsNull везде?

Ответы [ 4 ]

10 голосов
/ 27 мая 2011

Интересно, заметите ли вы улучшение, явно разделив случаи:

...
AND ((t1.vchCol1 = t2.vchCol1) OR (t1.vchCol1 IS NULL AND t2.vchCol1 IS NULL))
AND ((t1.vchCol2 = t2.vchCol2) OR (t1.vchCol2 IS NULL AND t2.vchCol2 IS NULL))
...
3 голосов
/ 27 мая 2011

Большинство статей на эту тему, кажется, противоречат этому.ISNULL (незначительно) быстрее, чем COALESCE.

Различия между ISNULL и COALESCE

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

ISNULL против COALESCE

Я запускал эти тесты несколько раз на нескольких разных серверах, и ISNULL, по-видимому, довольно стабильно превосходил COALESCE в среднем на 10 или 12 процентов.Но это разница между 6 секундами и 5,3 секундами (приблизительное среднее время выполнения теста на моих серверах) в течение миллиона исключений.Вряд ли стоит жертвовать функциональностью и соответствием стандартам, по крайней мере в сценариях, для которых я использую эти функции.

COALESCE против ISNULL против IS NULL OR

лучший исполнитель - дело IS NULL OR, тогда как разница между всеми тремя незначительна.

2 голосов
/ 27 мая 2011

Вы можете рассмотреть возможность добавления вычисляемого столбца к каждой таблице, которая содержит значение контрольной суммы.Затем создайте индекс для столбца ID и значение контрольной суммы и, наконец, используйте значение контрольной суммы в соединении.Примерно так:

Alter Table T1 Add CheckSumId As CHECKSUM(vchCol1, vchCol2, vchCol3)
Alter Table T2 Add CheckSumId As CHECKSUM(vchCol1, vchCol2, vchCol3)

Create NonClustered index idx_T1_Checksum On T1(id, CheckSumId)
Create NonClustered index idx_T2_Checksum On T2(ext_id, CheckSumId)

Тогда ваш запрос станет ...

select t1.id, t2.id 
from t1 Inner Join t2
       On t1.id = t2.ext_id
       And T1.CheckSumId = T2.CheckSumId
where  isnull(t1.vchCol1, 'Null') = isnull(t2.vchCol1, 'Null')
     and isnull(t1.vchCol2, 'Null') = isnull(t2.vchCol2, 'Null')

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

1 голос
/ 27 января 2012

Я понимаю, что это год спустя, но ...

Для такого сравнения столбцов вы можете использовать EXCEPT.Кроме того, EXCEPT обрабатывает NULL как другое значение вместо «Это может быть что угодно!», Как мне нравится его называть.

«Когда вы сравниваете строки для определения различных значений, два значения NULL считаются равными».- от http://msdn.microsoft.com/en-us/library/ms188055.aspx

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