Представьте, что у нас есть две таблицы:
Trades
(
TradeRef INT NOT NULL,
TradeStatus INT NOT NULL,
Broker INT NOT NULL,
Country VARCHAR(3) NOT NULL
)
CTMBroker
(
Broker INT NOT NULL,
Country VARCHAR(3) NULL
)
(Это было упрощено для целей данного примера). Теперь, если мы хотим объединить эти две таблицы в столбце Broker и , если в таблице CTMBroker существует страна в этой стране, у нас есть два следующих варианта:
SELECT T.TradeRef,T.TradeStatus
FROM Trades AS T
JOIN CTMBroker AS B ON B.Broker=T.Broker AND ISNULL(B.Country, T.Country) = T.Country
или
SELECT T.TradeRef,T.TradeStatus
FROM Trades AS T
JOIN CTMBroker AS B ON B.Broker=T.Broker AND (B.COUNTRY=T.Country OR B.Country IS NULL)
Оба они логически эквивалентны, однако в этом конкретном случае для нашей базы данных (SQL Server 2008, SP1) создаются два разных плана выполнения для этих двух запросов, причем вторая версия значительно превосходит первую версию с точки зрения времени и логики читает.
Мой вопрос на самом деле следующий: как общее правило было бы предпочтительнее (2), чем (1), или это просто случайность использования определенной специфической особенности оптимизатора в SP1 2008 (которая может поэтому измениться в будущих версиях) SQL Server).