ПЕРЕКРЕСТНОЕ ПРИМЕНЕНИЕ против ВНЕШНЕГО ПРИМЕНЕНИЯ разница в скорости

Я использовал CROSS APPLY для присоединения к таблицам Users и GeoPhone, и все работало быстро, но теперь у меня есть Пользователи со значениями NULL в столбце Phone. Cross apply пропускает эти строки в окончательном выводе. Поэтому я переключился на ВНЕШНЕЕ ПРИМЕНЕНИЕ. Но он работает намного медленнее (более чем в 15 раз медленнее, когда общее количество выводимых строк увеличилось всего на 1000).

SELECT TOP (10000) dbo.Users.Login, dbo.Users.Phone, GeoPhone.Country
FROM  dbo.Users CROSS APPLY
                 (SELECT TOP 1 Country
                 FROM    dbo.GeoPhone
                 WHERE dbo.Users.Phone <= dbo.GeoPhone.[End]) GeoPhone

Против:

SELECT TOP (10000) dbo.Users.Login, dbo.Users.Phone, GeoPhone.Country
FROM  dbo.Users OUTER APPLY
                 (SELECT TOP 1 Country
                 FROM    dbo.GeoPhone
                 WHERE dbo.Users.Phone <= dbo.GeoPhone.[End]) GeoPhone

Я пытаюсь понять, почему. Насколько я понимаю, план исполнения другой. Но теоретически я не вижу никаких вычислений, которые могут вызвать такое замедление.

Есть идеи?

МОЕ ОКОНЧАТЕЛЬНОЕ РЕШЕНИЕ:

SELECT TOP (10000) dbo.Users.Login, dbo.Users.Phone, GeoPhone.Country
FROM  dbo.Users CROSS APPLY
                 (SELECT TOP 1 Country
                 FROM    dbo.GeoPhone
                 WHERE ISNULL(dbo.Users.Phone, 0) <= dbo.GeoPhone.[End]) GeoPhone

Это назначает фактическую страну для ненулевых телефонов и страну из первого диапазона для нулевых телефонов (которые уже "НЕИЗВЕСТНО" для моего случая). По какой-то причине WHERE dbo.Users.Phone <= dbo.GeoPhone. [End] ИЛИ dbo.Users.Phone IS NULL дает те же результаты, но намного медленнее.

Пожалуйста, не стесняйтесь комментировать это .

51
задан Denis 18 July 2011 в 03:55
поделиться