什么时候在 Postgresql 查询中执行 offset 和 limit 关键字?

When are the offset and limit keywords executed in a Postgresql query?

我想了解 offsetlimit 语句何时在 Postgresql 查询中执行。给定一个格式如

的查询
select 
  a.*,
  (-- some subquery here) as sub_query_result
from some_table a
where -- some condition
offset :offset
limit :limit

我的理解是 table 将首先使用 where 语句进行过滤,然后将剩余的行投影到 select 语句定义的表单中。

offsetlimit 语句是否在select 语句中发生所有操作之后执行?还是先应用 whereoffsetlimit 语句,然后再应用查询的 select 部分?

我希望它首先应用 whereoffsetlimit 语句,如果我有一个结果集说 10,000 行,我只想要第二个1000 页,它只会执行子查询 1000 次,例如。

使用 LIMIT 但不使用 ORDER BY 的查询有点意义。来自 the documentation:

When using LIMIT, it is important to use an ORDER BY clause that constrains the result rows into a unique order. Otherwise you will get an unpredictable subset of the query's rows.

当存在 ORDER BY 子句时,select 列表中的表达式(包括子查询或函数)必须根据需要计算尽可能多的行以确定正确的顺序。在最佳情况下,如果总和小于过滤的行数,则计算的行数可能会限制为总和 LIMIT + OFFSET。这意味着(在某种简化中)OFFSET 越大,查询的时间越长 运行:

The rows skipped by an OFFSET clause still have to be computed inside the server; therefore a large OFFSET might be inefficient.

在某些情况下,当规划器将表达式识别为不可变时可能会进行优化,但通常您应该期望子查询将至少执行 LIMIT + OFFSET 次。在 Postgres 9.5 或更早版本中,如果排序不基于索引,计算的行数可能会更大。