首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在选择中间行时,我的查询是否存在效率问题?

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

Stack Overflow用户
提问于 2019-04-05 22:00:56
回答 2查看 121关注 0票数 3

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

代码语言:javascript
复制
SELECT * 
FROM Finance_User 
ORDER BY email DESC

我本来有:

代码语言:javascript
复制
SELECT 
    ROW_NUMBER() OVER (ORDER BY email DESC) AS RowNum, * 
FROM 
    Finance_User 
WHERE 
    RowNum BETWEEN 3 AND 5

但是,由于RowNum是一个无效的列,所以这是无效的。

相反,我做了以下几点:

代码语言:javascript
复制
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

这个很好用。然而,我担心这可能会有性能问题,因为它似乎是从表中挑选两次?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-04-05 22:13:22

带有CTE (或子查询)的ROW_NUMBER()不会扫描表两次。但是,使用窗口函数可能会对RDBMS产生额外的处理。

您可以在启动Server 2012的ORDER BY ... OFFSET ... FETCH ...中获得相同的结果,这些结果专门用于分页结果集:

代码语言:javascript
复制
SELECT *
FROM Finance_User
ORDER BY email DESC
OFFSET 2 ROWS FETCH NEXT 3 ROWS ONLY

从文件中:

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

票数 5
EN

Stack Overflow用户

发布于 2019-04-05 22:13:48

你的查询很好。

WITH AS子句是一个公共表表达式,这意味着以后可以重用该查询,如果需要和可能的话,应该缓存该查询。因此,“从表中选择两次”不应该有任何问题。

使用此查询可以获得相同的结果:

代码语言:javascript
复制
SELECT * from 
   (SELECT ROW_NUMBER() OVER (ORDER BY email DESC) AS RowNum, * FROM Finance_User) 
where RowNum between 3 and 5

最后,您可以始终检查执行计划并确保执行计划。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55543904

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档