Postgresql 11 Как я могу изменить порядок физических строк в базе данных в соответствии с отметкой времени - PullRequest
1 голос
/ 24 марта 2019

У меня есть таблица с именем streams, в которой есть несколько строк, мне нравится изменять порядок физических строк в базе данных в соответствии со столбцом creation_on. У меня есть в общей сложности 179 строк, строка (id) 179 должна иметь самую последнюю дату create_on, тогда строка (id) 178 должна иметь вторую самую новую дату create_on. Как вы можете видеть из небольшого фрагмента ниже, все не в порядке, например, дата на идентификаторе 172 новее, чем на идентификаторе 179. Я мог бы получить правильные данные, выполнив это

 select * from streams order by created_on desc

однако они хотят, чтобы он осуществлял поиск по идентификатору, например

select * from streams order by id desc

Следующий запрос, приведенный выше, дал следующие результаты. У нас все работало правильно, но мы выполнили переход с Postgres 10 на Postgres 11 и перепутали порядок вещей.

enter image description here

1 Ответ

2 голосов
/ 24 марта 2019

Вы можете заново сгенерировать значения столбца id с помощью UPDATE, например:

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>;
...