在Postgresql查询中何时执行offset和limit关键字?

时间:2018-07-18 21:38:44

标签: postgresql limit offset operator-precedence

我想了解offsetlimit语句何时在Postgresql查询中执行。给定具有

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

我的理解是,将首先使用where语句对表进行过滤,然后将其余的行投影到select语句所定义的形式中。

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

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

1 个答案:

答案 0 :(得分:3)

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

  

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

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

  

OFFSET子句跳过的行仍必须在服务器内部进行计算;因此,较大的OFFSET可能效率不高。

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