我想了解offset
和limit
语句何时在Postgresql查询中执行。给定具有等格式的查询
select
a.*,
(-- some subquery here) as sub_query_result
from some_table a
where -- some condition
offset :offset
limit :limit
我的理解是,表将首先使用where
语句进行过滤,然后剩余的行将投影到select
语句定义的表单中。
offset
和limit
语句是否在select
语句中发生所有操作之后执行?还是先应用where
、offset
和limit
语句,然后应用查询的select
部分?
我希望它首先应用where
、offset
和limit
语句,例如,如果我有一个10000行的结果集,并且我只想要1000的第二页,它只会执行子查询1000次。
带LIMIT但不带ORDER BY的查询有点道理。来自文件:
使用LIMIT时,使用ORDERBY子句将结果行约束为唯一顺序非常重要。否则,您将得到一个不可预测的查询行子集。
如果存在ORDER BY子句,则必须根据需要计算选择列表中的表达式(包括子查询或函数(中的行数,以确定正确的顺序。在最佳情况下,如果总和小于滤波行的数目,则计算的行的数目可以被限制为LIMIT+OFFSET的总和。这意味着(在某种简化中(OFFSET越大,查询运行的时间就越长:
OFFSET子句跳过的行仍然需要在服务器内部计算;因此大的OFFSET可能是低效的。
在某些情况下,当计划器将表达式识别为不可变时,可能会进行优化,但通常情况下,您应该期望子查询至少执行LIMIT+OFFSET次。在Postgres9.5或更早版本中,如果排序不基于索引,则计算的行数可能会更大。