#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 может использовать индексы для сортировки или результатов другой обработки, если эта обработка сортирует данные.