我在 PostgreSQL 中有一张表。我想根据特定列(不是主键)对行数据进行物理重新排序。在我的例子中,此列类型是 date
。我该怎么做?
最佳答案
如果您在该列上有索引,则 CLUSTER
命令将根据该索引对行进行物理“排序”
CLUSTER [VERBOSE] table_name [ USING index_name ]
http://www.postgresql.org/docs/current/static/sql-cluster.html
请注意,此“订单”不会自动维护,您需要定期手动运行该语句。
然而,这将不保证检索行时的任何特定顺序。即使不涉及连接或聚合也不行。
即使您所做的只是select * from the_table
,仍然无法保证返回行的顺序。例如:Postgres 有一个叫做“synchronized seq scan”的特性,这意味着如果一个 session 开始一个 seq 扫描(select * from ...
)并且另一个 session 正在做同样的事情,第二个在第一次 seq 扫描(无论在哪里)时搭载一个,然后在结果末尾添加“丢失”的行。
保证结果集顺序的唯一方法(实际上:唯一)是提供一个order by
子句。
这只有在您的服务器中有一个单个 硬盘(不是 SSD)时才有意义(至少对我而言)。在那种情况下,seq 扫描可能会更快,因为所有 block 可能都彼此相邻(这也不能保证,因为文件系统重用的方式可用空间)。
在 SSD 或使用带有许多硬盘的 RAID 阵列的适当服务器上,我看不出这有什么好处。
关于postgresql - 更改 PostgreSQL 中表行的顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14175992/