Я использую SQL Server 2008 и следующий запрос для реализации извлечения выгружаемых данных из нашего приложения JSF, в приведенном ниже коде я извлекаю 25 строк за время, отсортированное по столбцу сортировки по умолчанию в порядке DESC .
SELECT * FROM
(
SELECT TOP 25 * FROM
(
SELECT TOP 25 ...... WHERE CONDITIONS
--ORDER BY ... DESC
)AS INNERQUERY ORDER BY INNERQUERY.... ASC
)
AS OUTERQUERY
ORDER BY OUTERQUERY.... DESC
Работает, но с одним очевидным потоком.Если пользователи запрашивают просмотр последней страницы и в таблице содержится более 10 миллионов записей , тогда second TOP Query
будет необходимо сначала retrieve the 10 million
записей и только затем first top Query
выберет Top 25
, который будет выглядеть следующим образом:
SELECT * FROM
(
SELECT TOP 25 * FROM
(
SELECT TOP 10000000 ...... WHERE CONDITIONS
--ORDER BY ... DESC
)AS INNERQUERY ORDER BY INNERQUERY.... ASC
)
AS OUTERQUERY
ORDER BY OUTERQUERY.... DESC
Я пытался заменить вышеприведенное на ROW_NUMBER OVER (....), но, похоже, у меня возникла та же проблема, что и для второго оператора TOPдолжен получить полный результат, и только тогда вы сможете сделать where ROW_NUMBER between x and y
.
Не могли бы вы указать на мои ошибки в вышеупомянутом подходе и намеки на то, как его можно оптимизировать?