Интенсивное использование ISNULL по сравнению с вложенным SELECT - PullRequest
0 голосов
/ 09 февраля 2012

Мне интересно, эквивалентны ли эти два утверждения с точки зрения производительности:

Заявление 1:

SELECT
    ISNULL(T2.COL4, T1.COL4)
FROM
    T1 LEFT JOIN T2 ON T1.COL1 = T2.COL1
    JOIN T3 ON T2.COL1 IS NULL AND T3.COL2 = T1.COL2 OR T3.COL2 = T2.COL2
WHERE
    T3.COL3 = @COL3

Заявление 2:

SELECT
    T1.COL4
FROM
    (SELECT
        ISNULL (T2.COL4, T1.COL4) COL4,
        ISNULL (T2.COL2, T1.COL2) COL2
    FROM T1 LEFT JOIN T2 ON T1.COL1 = T2.COL1) T1
    JOIN T3 ON T1.COL2 = T3.COL2
WHERE
    T3.COL3 = @COL3

Два утвержденияфункционально эквивалентны (не так ли?), но здравый смысл подсказывает, что второе утверждение медленнее, потому что мы «перечисляем» T1 LEFT JOIN T2 перед применением предложения WHERE.Но действительно ли он медленнее или в SQL Server есть способ оптимизировать их и сделать их эквивалентными?

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

1 Ответ

1 голос
/ 09 февраля 2012

Другой способ написать запрос - это UNION из двух подзапросов с более простым условием соединения и без использования функции ISNULL():

SELECT
    T2.COL4
FROM
    T1 
  JOIN T2 ON T1.COL1 = T2.COL1
  JOIN T3 ON T3.COL2 = T2.COL2
WHERE
    T3.COL3 = @COL3

UNION ALL

SELECT
    T1.COL4
FROM
    T1 
  LEFT JOIN T2 ON T1.COL1 = T2.COL1
  JOIN T3 ON T3.COL2 = T1.COL2 
WHERE
    T2.COL1 IS NULL
  AND
    T3.COL3 = @COL3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...