Есть ли способ сохранить предварительно отсортированные строки в postgres?

#sql #postgresql

#sql #postgresql

Вопрос:

Рассмотрим таблицу T, доступную только для чтения, шаблон запроса этой таблицы:

 select some_columns
from T
where some_conditions
order by fixed_col1, fixed_col2
  

Есть ли способ позволить мне опустить order by предложение во время выполнения и предварительно отсортировать таблицу в автономном режиме и сохранить отсортированные строки в T, чтобы при select отключении order by выбранные строки были уже отсортированы?

PS: поведение должно быть где-то задокументировано или иметь здравый смысл для сообщества PG.

Комментарии:

1. По сути, никакого «порядка» внутри таблицы SQL не существует. Лучшее, что вы могли бы сделать здесь, это проиндексировать ваш запрос таким образом, чтобы упорядочение происходило быстро.

Ответ №1:

Вы можете использовать CLUSTER команду или просто создать новую таблицу с помощью команды CREATE TABLE xxx AS SELECT ... ORDER BY . Тем не менее, вы должны использовать ORDER BY statement, потому что PostgreSQL оптимизировал чтение больших таблиц и пытается использовать синхронизацию чтения для большего количества процессов. Эта синхронизация может сделать так, что чтение таблицы для одного процесса начинается с 1/3 таблицы — чтение до конца, возврат к началу и чтение первой 1/3. Таким образом, Postgres также не обеспечивает чтение данных в физическом порядке.

Ответ №2:

Есть ли способ позволить мне опустить предложение order by во время выполнения.

Нет, если вы хотите гарантированный порядок сортировки.

Единственный способ получить гарантированный порядок сортировки в запросе — использовать order by . альтернативы нет. Реляционные таблицы представляют собой неупорядоченные наборы, поэтому в таблице нет такого понятия, как «отсортированные строки».

Вам нужно будет использовать order by , чтобы получить гарантированный порядок сортировки.


поведение должно быть где-то задокументировано или иметь здравый смысл для сообщества PG.

Цитата из руководства

Если сортировка не выбрана, строки будут возвращены в неуказанном порядке. Фактический порядок в этом случае будет зависеть от типов планов сканирования и объединения и порядка на диске, но на него нельзя полагаться. Конкретный порядок вывода может быть гарантирован только в том случае, если явно выбран шаг сортировки.

(выделение мое)

Комментарии:

1. Стоит отметить, что Postgres не всегда сортирует результирующий набор только потому ORDER BY , что присутствует. Postgres может использовать индексы для сортировки или результатов другой обработки, если эта обработка сортирует данные.