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



我想了解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语句,例如,如果我有一个10000行的结果集,并且我只想要1000的第二页,它只会执行子查询1000次。

带LIMIT但不带ORDER BY的查询有点道理。来自文件:

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

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

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

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

最新更新