ROW_NUMBER查询数据是否需要获取整个结果集?

时间:2015-07-02 17:51:20

标签: sql postgresql

我正在尝试编写不使用偏移量的查询(因为我刚刚学会了偏移量来获取导致性能开销的所有数据)。使用ROW_NUMBER窗口功能。例如:

SELECT id
FROM(
SELECT id, ROW_NUMBER() over (order by id) rn
FROM users) sq
WHERE rn > 1000

是否需要像offset 1000那样获取所有行?我的意思是,使用这样的查询代替

是否合理
SELECT if
FROM users
OFFSET 1000

?我是否在大量数据上获得了性能提升?

2 个答案:

答案 0 :(得分:2)

查看window function文档。在获取后,窗口函数对结果集进行操作:

  

仅允许在SELECT列表和ORDER中使用窗口函数   查询的BY子句。他们被禁止在其他地方,例如GROUP   BY,HAVING和WHERE条款。这是因为它们在逻辑上执行   在处理这些条款之后。此外,窗口函数执行   经常聚合功能后。这意味着它包含有效   一个聚合函数调用窗口函数的参数,但是   反之亦然。

答案 1 :(得分:1)

使用row_number()查询是否有意义?好吧,它产生相同的结果集。但是,查询基本上必须将row_number()分配给所有行,以便找到符合要求的行。

然而,第二个查询缺少order by。使用offset时,您应该有order by

SELECT id
FROM users u
ORDER BY id
OFFSET 1000

我认为这比使用row_number()更有效,但实际时间会证明这一点。