Я не могу опубликовать фактический запрос здесь, поэтому я публикую основной план запроса, которого должно быть достаточно. Запрос используется для просмотра страницы и получения набора пользователей, ранжированных в соответствии с выводом функции, например, F. F берет параметры из таблицы User и других таблиц, которые объединяются. Запрос выглядит примерно так:
Select TOP (20)
from (select row_number OVER (Order By F desc) as rownum,
user.*, ..
from user
inner join X on user.blah = X.blah
left outer join Y on user.foo = Y.foo
where DATEDIFF(dd, LastLogin, GetDate()) > 200 and Y.bar > FUBAR) as temp
where rownum > 0
Согласно плану выполнения, 91% стоимости приходится на сортировку. Поскольку сортировка основана на F, я не могу добавить индекс для ускорения сортировки. Внутренний запрос запрашивает все записи, фильтрует и сортирует. Теперь большую часть времени пользователи просто смотрят на результаты на 1 - 5 страницах (1 страница имеет 20 записей, следовательно, Top (20)), поэтому я подумал, есть ли способ ограничить количество обрабатываемых и отсортированных строк и сделать запрос выполняется быстрее и требует меньше ресурсов процессора.
РЕДАКТИРОВАТЬ: Когда я говорю, чтобы вычислить F таблицы объединяются, я имею в виду это. F принимает такие параметры, как X.blah и Y.foo и Y.bar. Вот и все. Все эти параметры также должны быть возвращены как часть набора результатов. например Широта и долгота последнего местоположения пользователя хранятся в X.