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)
这工作得很好。但是,我担心这可能会导致性能问题,因为它似乎是两次从表中选择?
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子句来实现查询分页解决方案并限制发送到客户端应用程序的行数。