我正在尝试编写不使用偏移量的查询(因为我刚刚学会了偏移量来获取导致性能开销的所有数据)。使用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
?我是否在大量数据上获得了性能提升?
答案 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()
更有效,但实际时间会证明这一点。