Я использовал 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
дает те же результаты, но намного медленнее.
Пожалуйста, не стесняйтесь комментировать это .