我在 PostgreSQL 中有一张表。我想根据特定列(不是主键)对行数据进行物理重新排序。在我的情况下,此列类型是date
. 我该怎么做?
2 回答
如果您在该列上有索引,则该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 阵列的适当服务器上,我看不出这有什么好处。
你试过“订购”吗?例如,“SELECT * FROM table_name ORDER BY date ASC;”?如果您希望日期倒序,您可以尝试“DESC”而不是“ASC”。