考虑一个只读表T,该表的查询模式为:
select some_columns
from T
where some_conditions
order by fixed_col1, fixed_col2
有没有一种方法可以让我在运行时省略order by
子句,并离线对表进行预排序并将已排序的行存储在T中,以便当我select
时不使用order by
,所选行已经排序?
PS:行为必须记录在某个地方,或者是PG社区的常识。
答案 0 :(得分:3)
是否可以让我在运行时省略order by子句。
否,如果您想要有保证的排序顺序,则不需要。
在查询中获得有保证的排序顺序的仅方法是使用order by
。没有替代。关系表表示无序集,因此表中没有“已排序的行”之类的东西。
您将必须使用order by
来获得有保证的排序顺序。
行为必须记录在某个地方,或者是PG社区的常识。
如果未选择排序,则将以未指定的顺序返回行。在这种情况下,实际顺序将取决于扫描和加入计划的类型以及磁盘上的顺序,但不得依赖。如果明确选择了排序步骤,则只能保证特定的输出顺序 。
(重点是我的)
答案 1 :(得分:2)
您可以使用CLUSTER
command,也可以仅通过命令CREATE TABLE xxx AS SELECT ... ORDER BY
创建新表。仍然应该使用ORDER BY
语句,因为PostgreSQL已经优化了对更大表的读取,并尝试对更多进程使用同步读取。这种同步可以使一个进程的表读取从表的1/3开始-从头到尾,从头开始回到前1/3。因此,Postgres也不能确保按物理顺序读取数据。