我想了解offset和limit语句何时在Postgresql查询中执行。给定格式的查询,如
select
a.*,
(-- some subquery here) as sub_query_result
from some_table a
where -- some condition
offset :offset
limit :limit我的理解是,首先使用where语句对表进行过滤,然后按照select语句的定义,将其余的行投影到表单中。
offset和limit语句在select语句中发生所有操作后执行吗?还是首先应用where、offset和limit语句,然后应用查询的select部分?
我希望它首先应用where、offset和limit语句,如果我有一个10,000行的结果集,并且我只想要1000的第2页,它只执行子查询1000次,例如。
发布于 2018-07-18 22:15:50
有限制但没有顺序的查询有点道理。来自文件:
在使用限制时,重要的是使用order子句将结果行约束为唯一顺序。否则,您将得到查询的行中不可预测的子集。
当order子句存在时,必须根据需要对select列表中的表达式(包括子查询或函数)进行计算,以确定正确的顺序。在最佳情况下,如果计算的行数小于过滤行数,则计算行数可以限制为和限制+偏移量。这意味着(在某些简化中)偏移量越大,查询运行的时间就越长:
偏移子句跳过的行仍必须在服务器内部计算;因此,较大的偏移量可能效率很低。
在某些情况下,当规划者将一个表达式识别为不可变时,可能会进行优化,但通常您应该期望至少执行一个子查询的时间限制+偏移量。在Postgres 9.5或更早版本中,如果排序不是基于索引,则计算的行数可能会更大。
https://stackoverflow.com/questions/51411347
复制相似问题