我在PostgreSQL中有一张表,我想根据特定列(不是主键)对行数据进行物理重新排序。 在我的情况下,这个列的类型是date
。 我该如何做?
我在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有一个名为“同步序列扫描”的功能,这意味着如果一个会话开始了一个序列扫描(select * from ...
),而另一个会话正在做相同的事情,则第二个会话将在第一个序列扫描(不管在哪里)上进行搭便车,然后在结果末尾添加“遗漏”的行。
保证结果集的顺序的唯一方法是提供一个order by
子句。
只有在服务器上有单个硬盘(不是SSD)时(至少对我来说)才有意义。在这种情况下,序列扫描可能更快,因为所有块可能紧挨着彼此(这也不是保证,因为文件系统重用空闲空间的方式)。
在SSD或使用许多硬盘的RAID阵列的适当服务器上,我看不出任何方面的好处。
CLUSTER
来物理重新排序行,以更好地适应索引,那么重新排序会破坏我的索引吗?还是它会随着CLUSTER
操作一起更新?我想说的是,为了使BRIN发挥最佳作用,不应该反过来进行:重新排序,然后创建索引。那么如何实现呢? - Damian Birchler
order by
。 - user330315