Postgresql 11 如何根据时间戳对数据库中的物理行重新排序

Postgresql 11 How can I reorder the physical rows in the database according to a timestamp

我有一个名为 streams 的 table,它有几行,我喜欢根据 created_on 列更改数据库中物理行的顺序。我总共有 179 行,第 (id) 179 行应该有最新的 created_on 日期,然后第 (id) 178 行应该有第二个最新的 created_on 日期。正如您从下面的小片段中看到的那样,事情并不是按顺序排列的,例如 id 172 上的日期比 id 179 上的日期新。我可以通过这样做得到正确的数据

 select * from streams order by created_on desc

但是他们希望它按这样的 ID 进行搜索

select * from streams order by id desc

上面的以下查询产生了以下结果。我们让一切正常工作,但我们从 Postgres 10 迁移到 Postgres 11 并弄乱了事情的顺序。

您可以使用 UPDATE 重新生成 id 列值,如下所示:

UPDATE streams SET id = tmp.row_id
FROM  (SELECT id, row_number() OVER (ORDER BY created_on, id) AS row_id FROM streams) AS tmp
WHERE streams.id = tmp.id;

之后,您可能希望使用 CLUSTER:

对磁盘上的物理行重新排序
CLUSTER streams USING <index-for-id-column>;