有没有一种方法可以将预排序的行存储在postgres中?

时间:2020-10-27 04:06:09

标签: sql postgresql

考虑一个只读表T,该表的查询模式为:

select some_columns
from T
where some_conditions
order by fixed_col1, fixed_col2

有没有一种方法可以让我在运行时省略order by子句,并离线对表进行预排序并将已排序的行存储在T中,以便当我select时不使用order by ,所选行已经排序?

PS:行为必须记录在某个地方,或者是PG社区的常识。

2 个答案:

答案 0 :(得分:3)

是否可以让我在运行时省略order by子句。

否,如果您想要有保证的排序顺序,则不需要。

在查询中获得有保证的排序顺序的方法是使用order by。没有替代。关系表表示无序集,因此表中没有“已排序的行”之类的东西。

您将必须使用order by来获得有保证的排序顺序。


行为必须记录在某个地方,或者是PG社区的常识。

Quote from the manual

如果未选择排序,则将以未指定的顺序返回行。在这种情况下,实际顺序将取决于扫描和加入计划的类型以及磁盘上的顺序,但不得依赖。如果明确选择了排序步骤,则只能保证特定的输出顺序

(重点是我的)

答案 1 :(得分:2)

您可以使用CLUSTER command,也可以仅通过命令CREATE TABLE xxx AS SELECT ... ORDER BY创建新表。仍然应该使用ORDER BY语句,因为PostgreSQL已经优化了对更大表的读取,并尝试对更多进程使用同步读取。这种同步可以使一个进程的表读取从表的1/3开始-从头到尾,从头开始回到前1/3。因此,Postgres也不能确保按物理顺序读取数据。