我想了解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
语句,如果我的结果集说有10,000行,而我只想要第2页1000,例如,它将只执行1000次子查询。
答案 0 :(得分:3)
使用LIMIT但不使用ORDER BY的查询有点道理。来自the documentation:
使用LIMIT时,重要的是使用ORDER BY子句将结果行约束为唯一顺序。否则,您将获得查询行的不可预测的子集。
当存在ORDER BY子句时,必须对选择列表中的表达式(包括子查询或函数)进行求值,以确定所需的行数,以确定正确的顺序。在最佳方案中,如果总和小于已过滤的行数,则可以将计算的行数限制为LIMIT + OFFSET。这意味着(以某种简化方式)偏移量越大,查询运行的时间就越长:
OFFSET子句跳过的行仍必须在服务器内部进行计算;因此,较大的OFFSET可能效率不高。
在某些情况下,当计划程序将表达式识别为不可变时,可能会有一些优化,但是通常您应该期望子查询将至少执行LIMIT + OFFSET次。在Postgres 9.5或更早的版本中,如果排序不是基于索引的,则计算的行数甚至可能更大。