Мне интересно, эквивалентны ли эти два утверждения с точки зрения производительности:
Заявление 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.