我在PostgreSQL中有一个表。我想根据特定列(不是主键)物理地重新排序行数据。就我而言,此列类型为date
。我该怎么办?
答案 0 :(得分:9)
如果您在该列上有索引,则CLUSTER
命令将在物理上" order"根据该索引的行
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"的功能,这意味着如果一个会话启动seq扫描(select * from ...
)而另一个会话正在执行相同的操作,则第二个会话回到第一个seq扫描(在哪里),然后添加"错过"结果末尾的行。
仅 方式来保证结果集的顺序(实际上:仅)是提供order by
子句。
如果您的服务器中有单硬盘(不是 SSD),这只对我有意义(至少对我而言)。在这种情况下,seq扫描可能更快,因为所有块可能彼此相邻(由于文件系统重新设置的方式,因此无法保证) - 使用自由空间)。
在使用具有许多硬盘的RAID阵列的SSD或适当的服务器上,我无法看到这对任何方式都有益。
答案 1 :(得分:-1)
你有没有试过" ORDER BY"?例如," SELECT * FROM table_name ORDER BY date ASC;"?如果您想要相反的日期,您可以尝试" DESC"而不是" ASC"。