Есть ли проблема с эффективностью моего запроса для выбора средних строк? - PullRequest
3 голосов
/ 06 апреля 2019

Я пытаюсь выбрать строки 3 - 5 из:

SELECT * 
FROM Finance_User 
ORDER BY email DESC

У меня изначально было просто:

SELECT 
    ROW_NUMBER() OVER (ORDER BY email DESC) AS RowNum, * 
FROM 
    Finance_User 
WHERE 
    RowNum BETWEEN 3 AND 5

Но это не сработало, поскольку RowNum был недопустимым столбцом,

Вместо этого я сделал следующее:

WITH OrderedUsers AS 
(
    SELECT 
        ROW_NUMBER() OVER (ORDER BY email DESC) AS RowNum, * 
    FROM 
        Finance_User
)
SELECT *  
FROM OrderedUsers 
WHERE RowNum BETWEEN 3 AND 5

Это прекрасно работает.Тем не менее, я обеспокоен тем, что могут быть проблемы с производительностью, так как, кажется, выбирает из таблицы дважды?

Ответы [ 2 ]

5 голосов
/ 06 апреля 2019

ROW_NUMBER() с CTE (или подзапросом) не будет сканировать таблицу дважды.Однако использование оконной функции может привести к дополнительной обработке для СУБД.

Вы можете достичь тех же результатов с ORDER BY ... OFFSET ... FETCH ..., доступным начиная с SQL-Server 2012, которые предоставлены специально для этой цели.подкачки результирующего набора:

SELECT *
FROM Finance_User
ORDER BY email DESC
OFFSET 2 ROWS FETCH NEXT 3 ROWS ONLY

Из документации:

Мы рекомендуем использовать предложения OFFSET и FETCH вместо предложения TOP для реализации решения и ограничения подкачки запросов.количество строк, отправленных клиентскому приложению.

3 голосов
/ 06 апреля 2019

Ваш запрос в порядке.
WITH AS предложение является общим выражением таблицы , что означает, что этот запрос может быть повторно использован позже и должен быть кэширован, если необходимо и возможно. Так что не должно быть никаких проблем с «выбором из таблицы дважды».

Тот же результат вы можете получить с помощью этого запроса:

SELECT * from 
   (SELECT ROW_NUMBER() OVER (ORDER BY email DESC) AS RowNum, * FROM Finance_User) 
where RowNum between 3 and 5

И, наконец, вы всегда можете проверить план выполнения и убедиться в этом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...