【问题标题】:When are the offset and limit keywords executed in a Postgresql query?什么时候在 Postgresql 查询中执行 offset 和 limit 关键字?
【发布时间】:2018-12-26 22:11:18
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: postgresql limit offset operator-precedence


    【解决方案1】:

    带有 LIMIT 但没有 ORDER BY 的查询有点意义。来自the documentation:

    使用 LIMIT 时,使用 ORDER BY 子句将结果行约束为唯一顺序非常重要。否则,您将获得查询行的不可预测的子集。

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

    OFFSET 子句跳过的行仍然需要在服务器内部计算;因此,较大的 OFFSET 可能效率低下。

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

    【讨论】:

      猜你喜欢
      • 2011-03-20
      • 2012-08-25
      • 1970-01-01
      • 2021-05-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-30
      • 1970-01-01
      相关资源
      最近更新 更多