什么时候在 Postgresql 查询中执行 offset 和 limit 关键字?
When are the offset and limit keywords executed in a Postgresql query?
我想了解 offset
和 limit
语句何时在 Postgresql 查询中执行。给定一个格式如
的查询
select
a.*,
(-- some subquery here) as sub_query_result
from some_table a
where -- some condition
offset :offset
limit :limit
我的理解是 table 将首先使用 where
语句进行过滤,然后将剩余的行投影到 select
语句定义的表单中。
offset
和limit
语句是否在select
语句中发生所有操作之后执行?还是先应用 where
、offset
和 limit
语句,然后再应用查询的 select
部分?
我希望它首先应用 where
、offset
和 limit
语句,如果我有一个结果集说 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 或更早版本中,如果排序不基于索引,计算的行数可能会更大。
我想了解 offset
和 limit
语句何时在 Postgresql 查询中执行。给定一个格式如
select
a.*,
(-- some subquery here) as sub_query_result
from some_table a
where -- some condition
offset :offset
limit :limit
我的理解是 table 将首先使用 where
语句进行过滤,然后将剩余的行投影到 select
语句定义的表单中。
offset
和limit
语句是否在select
语句中发生所有操作之后执行?还是先应用 where
、offset
和 limit
语句,然后再应用查询的 select
部分?
我希望它首先应用 where
、offset
和 limit
语句,如果我有一个结果集说 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 或更早版本中,如果排序不基于索引,计算的行数可能会更大。