更改PostgreSQL中表行的顺序

f.a*_*uri 10 postgresql performance

我在PostgreSQL中有一个表.我想根据特定列(不是主键)物理地重新排序行数据.在我的情况下,此列类型是date.我该怎么做?

a_h*_*ame 13

如果您在该列上有索引,那么该CLUSTER命令将根据该索引对这些行进行物理"排序"

CLUSTER [VERBOSE] table_name [ USING index_name ]
Run Code Online (Sandbox Code Playgroud)

http://www.postgresql.org/docs/current/static/sql-cluster.html

请注意,此"订单"不会自动维护,您需要手动定期运行该"语句".


但是,这将在检索行时保证任何特定顺序.即使没有涉及联接或聚合也不行.

即使您所做的只是select * from the_table返回行的顺序仍然无法保证.例如:Postgres有一个名为"synchronized seq scan"的功能,这意味着如果一个会话启动seq scan(select * from ...)而另一个会话正在执行相同的操作,则第二个会话在第一个seq扫描中捎带(在那里is)然后在结果的末尾添加"遗漏"行.

只有这样,才能保证结果集的顺序(真:该)是提供一个order by条款.


这仅是有道理的(至少对我来说),如果你有一个单一的服务器硬盘(这是不是一个SSD).在这种情况下,seq扫描可能会更快,因为所有块可能正好相邻(由于文件系统重新使用可用空间的方式,因此无法保证).

在使用具有许多硬盘的RAID阵列的SSD或适当的服务器上,我无法看到这对任何方式都有益.


edl*_*lee -4

您尝试过“ORDER BY”吗?例如,“SELECT * FROM table_name ORDER BY date ASC;”?如果您希望日期按相反顺序排列,可以尝试“DESC”而不是“ASC”。