我的查询是否存在选择中间行的效率问题?

3 sql t-sql sql-server performance

我正在尝试选择第3-5行:

SELECT * 
FROM Finance_User 
ORDER BY email DESC
Run Code Online (Sandbox Code Playgroud)

我最初只有:

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

但这不起作用,因为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
Run Code Online (Sandbox Code Playgroud)

这工作得很好。但是,我担心这可能会导致性能问题,因为它似乎是两次从表中选择?

GMB*_*GMB 5

ROW_NUMBER()使用CTE(或子查询)的用户不会两次扫描表格。但是,使用窗口功能可能会导致RDBMS进行其他处理。

您可以ORDER BY ... OFFSET ... FETCH ...使用从SQL Server 2012开始可用的相同结果,这些结果是专门用于分页结果集的:

SELECT *
FROM Finance_User
ORDER BY email DESC
OFFSET 2 ROWS FETCH NEXT 3 ROWS ONLY
Run Code Online (Sandbox Code Playgroud)

从文档中:

我们建议您使用OFFSET和FETCH子句而不是TOP子句来实现查询分页解决方案并限制发送到客户端应用程序的行数。