16

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

4

2 回答 2

27

如果您在该列上有索引,则该CLUSTER命令将根据该索引对行进行物理“排序”

CLUSTER [VERBOSE] table_name [ USING index_name ]

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

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


但是,这不会保证检索行时的任何特定顺序。即使不涉及连接或聚合,也不会。

即使您所做select * from the_table的只是返回行的顺序,仍然不能保证。例如:Postgres 有一个称为“同步 seq 扫描”的功能,这意味着如果一个会话开始 seq 扫描select * from ...(是),然后在结果的末尾添加“错过”的行。

保证结果集顺序的唯一方法(真的:唯一)是提供一个order by子句。


仅当您的服务器中有一个硬盘(不是SSD)时,这才有意义(至少对我而言)。在这种情况下,seq 扫描可能会更快,因为所有块可能彼此相邻(由于文件系统重用可用空间的方式,这也不能保证)。

在 SSD 或使用带有许多硬盘的 RAID 阵列的适当服务器上,我看不出这有什么好处。

于 2016-01-10T19:07:48.233 回答
-4

你试过“订购”吗?例如,“SELECT * FROM table_name ORDER BY date ASC;”?如果您希望日期倒序,您可以尝试“DESC”而不是“ASC”。

于 2014-08-22T16:04:59.117 回答