Нет ничего плохого в использовании TOP
и DISTINCT
, независимо от существующей конструкции UNION ALL
.Если вам нужны именно эти данные, то это способ сделать это.
Однако, когда вы запрашиваете DISTINCT
, вы должны понимать, что системе, возможно, придется просмотреть много записей, чтобы убедиться в этом.выбирает достаточное количество необработанных данных, чтобы получить требуемое количество значений DISTINCT;в худшем случае это должно пройти все 20 миллионов записей!MSSQL довольно хорошо угадывает, сколько строк ему понадобится, используя статистику, имеющуюся в имеющихся данных.
Теперь, возможно, ваша статистика «далеко», из-за чего система выбирает «слишком мало»«записей, дающих эти 800« быстрых результатов », которые вы получаете, но затем тратите много времени на выборку следующих 200 (различных значений) из таблицы.
Я бы предложил попробовать сделать 2 вещи:
- попросите приблизительный план и научитесь его интерпретировать
- обновите статистику для указанных таблиц, а затем повторите попытку, посмотрите, изменился ли оценочный план;особенно интересным будет предполагаемое количество строк
Удачи, Роби
PS: имейте в виду, что при запросе TOP n
вы получите «случайный выбор» извсе данные;нет никакой гарантии, что вы получите 'первые' n строк из таблицы!Для этого вам необходимо явно указать предложение ORDER BY
, потенциально добавляя (много) дополнительную работу к выполнению запроса;снова, план запроса покажет это.(Вы можете набрать оба запроса одновременно и запросить примерный план, чтобы увидеть различия. При этом если один запрос стоит 10%, а другой - 90%, это не означает, что один запрос будет выполняться в 9 раз быстрее, чемс другой стороны, стоимость не совпадает со временем, хотя между ними действительно есть связь, но не линейная)