PRODСуверенная европейская платформа BaaSОткрыть панель управления →

Производительность · 9 минута чтения

Postgres 16 против 17 против 18: выигрыш, который имеет значение

Affane Daylami · Fondateur · 27 мая 2026 г.

Вернуться в блог

Postgres 17 не «быстрее», чем Postgres 16, при выполнении неопределенного набора запросов. Реальный выигрыш достигается за счет двух конкретных областей: памяти, потребляемой VACUUM на больших таблицах, и конкуренции за соединения с высокой конкуренцией. В Postgres 18, выпущенном в конце 2025 года, добавлено еще более глубокое изменение: асинхронный ввод-вывод. Вот что на самом деле меняют эти версии, их исходные коды и почему, несмотря на это, Aurabase до сих пор использует Postgres 16 в производстве.

Этот текст на английском языке был создан автоматически на основе французского оригинала и еще не проверялся.
Эта страница была переведена автоматически. Английская версия является авторитетной.

Эта статья основана на официальной документации проекта PostgreSQL и двух технических анализах, публикуемых после каждого основного выпуска: Microsoft Tech Community (команда Azure Database для PostgreSQL) и Crunchy Data. Ни один из приведенных ниже рисунков не является воспроизведенным нами эталоном: когда данные поступают от третьей стороны, мы указываем их с указанием источника и даты. Информацию о методологии, которую мы применяем к нашим собственным измерениям, см. в разделе методологии эталонного тестирования.

Самое необходимое
  • Основным преимуществом Postgres 17 является капитальный ремонт памяти VACUUM (структура TidStore), который устраняет старое ограничение в размере около 1 ГБ. В официальных примечаниях к выпуску указано, что в некоторых случаях используется до 20 раз меньше памяти.
  • Postgres 17 также уменьшает конфликты при вычислении снимков транзакций, что особенно полезно для экземпляров с высоким уровнем параллелизма на многоядерном оборудовании.
  • В Postgres 18 (конец сентября 2025 г.) представлен асинхронный ввод-вывод (AIO), наиболее структурное архитектурное изменение в нескольких основных выпусках, особенно для хранилищ с высокой задержкой.
  • В Postgres 18 также добавлено пропуск сканирования в индексах B-дерева с несколькими столбцами, виртуальные генерируемые столбцы по умолчанию и поддержка OAuth 2.0 для аутентификации.
  • Aurabase сегодня использует Postgres 16.15 в производстве, что проверено в коде: это не задержка, а документированный выбор, связанный с необратимостью обновлений основных версий под CloudNativePG.
#
Обзор

Что на самом деле меняется между Postgres 16, 17 и 18

Три версии не отличаются единым общим показателем производительности. Каждый из них исправляет определенный момент архитектуры, каждый раз для разной аудитории: большие таблицы для Postgres 17, хранилище с высокой задержкой для Postgres 18. В таблице ниже обобщаются проверяемые факты, все датированные, прежде чем углубляться в детали каждого проекта.

ВерсияPostgreSQL 16PostgreSQL 17PostgreSQL 18
Дата выпуска14 сентября 2023 г.26 сентября 2024 г.конец сентября 2025 г.
ВАКУУМ на больших столахМертвые кортежи в массиве, потолок памяти ≈ 1 ГБСтруктура TidStore (радиксное дерево), приподнятый потолокНаследует структуру, представленную в 17
Ввод-выводСинхронно, поблочноПотоковый ввод-вывод для АНАЛИЗА и последовательного сканированияОбобщенный асинхронный ввод-вывод (AIO), настраиваемый io_method
Параллельные соединенияИзвестные разногласия по поводу расчета моментального снимкаУменьшение конфликтов (оптимизирован GetSnapshotData)Наследует преимущества, представленные в 17
Многостолбцовый индекс B-дереваПолное сканирование, если в фильтре отсутствует столбец заголовка.То же, что и Postgres 16.Пропустить сканирование: возможно частичное сканирование
Сгенерированные столбцытолько СОХРАНЕНОТо же, что и Postgres 16.Добавлен ВИРТУАЛЬНЫЙ, становится поведением по умолчанию.
АутентификацияSCRAM, LDAP, сертификатыТо же, что и Postgres 16.+ OAuth 2.0 (RFC 8628, поток устройств)

Источники: официальные примечания к выпуску проекта PostgreSQL (postgresql.org), перекрестные ссылки на анализы, опубликованные Microsoft Tech Community и Crunchy Data после каждого основного выпуска. По состоянию на 24 августа 2026 г.

#
Постгрес 17

Обновление памяти VACUUM меняет правила игры для больших столов

До версии Postgres 17 VACUUM хранил список мертвых кортежей для очистки в простом массиве размером maintenance_work_mem. Проблема была не в скорости расчета, а в самой структуре: эта таблица стабильно занимала около 1 ГБ, сколько бы сверх этого ни настраивалось. В таблице с более чем 178 миллионами мертвых строк VACUUM пришлось выполнить несколько проходов, каждый из которых перечитывал все индексы.

Postgres 17 заменяет этот массив структурой под названием TidStore, адаптивным базовым деревом, которое сильно сжимает пространство, необходимое для хранения идентификаторов кортежей. Официальные примечания к выпуску проекта указывают на сокращение памяти, используемой VACUUM, в некоторых случаях до 20 раз, без искусственного потолка, связанного со старой конструкцией. Источник: официальные примечания к выпуску PostgreSQL 17, postgresql.org, 26 сентября 2024 г. Microsoft Tech Community и Crunchy Data опубликовали технический анализ этого изменения вскоре после выпуска. Оба подтверждают конкретный интерес к таблицам из нескольких сотен миллионов строк с высокой частотой удаления или обновления.

×20
Меньше ВАКУУМНОЙ памяти
измеренные случаи, примечания к выпуску PostgreSQL 17
≈1 ГБ
Старый потолок памяти
мертвая структура массива кортежей, Postgres ≤16
16.15
Версия с поддержкой Aurabase
код заезда зарегистрирован 24 августа 2026 г.

Этот проект в основном приносит пользу конкретному сценарию: большая таблица с высокой частотой удаления или обновления. Раньше VACUUM выполнялся в несколько проходов из-за нехватки доступной памяти. На маленьком столе или при нагрузке преимущественно чтения выигрыш остается незначительным или даже невидимым.

#
Постгрес 17

Меньше конфликтов при соединениях с высоким уровнем параллелизма

Второй проект Postgres 17 затрагивает более деликатный момент: расчет снимков транзакций. Каждый запрос должен знать, какие еще транзакции выполняются, чтобы обеспечить соблюдение правил видимости MVCC Postgres. На машине с большим количеством ядер и активных соединений этот расчет вызвал разногласия по поводу общей внутренней структуры. Это узкое место, которое уже давно документировано участниками проекта.

Postgres 17 уменьшает это противоречие. Эффект в основном измеряется на экземплярах с высоким уровнем параллелизма и множеством одновременных активных подключений на многоядерном оборудовании. При низкой нагрузке параллелизма разница с Postgres 16 остается незначительной: это проект масштабируемости, а не уменьшение задержки на изолированный запрос.

Этот выигрыш не заменяет пул соединений, а просто снижает его внутреннюю стоимость. Если количество активных подключений уже является вашим узким местом, основная версия отходит на второй план. В нашем руководстве по настройке max_connections и в нашем сравнении режимов транзакций PgBouncer этот вопрос рассматривается более подробно.

#
Постгрес 18

Асинхронный ввод-вывод: самое глубокое архитектурное изменение за последние годы

Postgres 18, выпущенный в конце сентября 2025 года, решает более структурную проблему. До этого каждое чтение диска Postgres блокировало запрашивавший его процесс. Новая подсистема асинхронного ввода-вывода (AIO) позволяет процессу инициировать несколько операций чтения параллельно и продолжать работу до их завершения, вместо того, чтобы последовательно ждать каждого из них.

Параметр io_method управляет этим поведением: worker (процессы, предназначенные для ввода-вывода, по умолчанию) или io_uring в Linux, если Postgres был скомпилирован с этой поддержкой. Последовательное сканирование, сканирование кучи растровых изображений и VACUUM — первые преимущества, особенно в хранилищах с высокой задержкой: сетевых дисках, облачных томах, а не локальном NVMe.

PlanetScale, предлагающая управляемое предложение Postgres, опубликовала собственное сравнение Postgres 17 и 18, ориентированное на это изменение ввода-вывода. Это их измерения на собственной инфраструктуре, а не цифры, которые мы воспроизвели здесь независимо. Воспринимайте это как сигнал о том, что предмет стоит тестировать на реальной нагрузке, а не в универсальном проценте.

Обобщенный AIO Postgres 18 продолжает проект, начатый в Postgres 17, а не является изолированным изменением. Версия 17 уже представила интерфейс потокового ввода-вывода, но ограничивалась АНАЛИЗОМ и последовательным сканированием. Postgres 18 расширяет ту же логику для более широкого спектра операций, включая VACUUM и сканирование кучи растровых изображений. Таким образом, две версии воспринимаются как прогресс, а не как две отдельные ставки на ввод-вывод.

#
Постгрес 18

Другие важные изменения

Заслуживают внимания еще три изменения в Postgres 18, даже если они напрямую не касаются производительности.

Пропуск сканирования в индексе B-дерева с несколькими столбцами позволяет Postgres использовать составной индекс, даже если запрос не фильтрует его головной столбец. До версии Postgres 18 этот сценарий часто требовал полного сканирования таблицы или создания дополнительного выделенного индекса.

Созданные виртуальные столбцы (GENERATED ALWAYS AS (...) VIRTUAL) становятся поведением по умолчанию, если STORED не указан. Виртуальный столбец рассчитывается при чтении, а не при записи на диск, что уменьшает объем записи каждый раз, когда исходная строка вставляется или обновляется.

В Postgres 18 наконец добавлена ​​поддержка OAuth 2.0 на стороне аутентификации (RFC 8628, поток устройств), наряду с существующими механизмами, такими как SCRAM, сертификаты или LDAP. Актуальный момент для любой организации, которая уже централизует свои удостоверения через внешнего поставщика OAuth/OIDC.

#
Реальный случай

Почему Aurabase по-прежнему работает на Postgres 16 и что изменит этот выбор

В Aurabase база данных клиентов в настоящее время работает в Postgres 16.15, а не 17. Это можно проверить непосредственно в репозитории: эталонный образ CNPG (docker/Postgres.CNPG.Dockerfile) начинается с ghcr.io/cloudnative-pg/postgresql:16-standard-bookworm, закрепленного дайджестом, той же основной версии, что и общий уровень (docker/Postgres.Dockerfile). Проверено 24 августа 2026 г.

Кодекс также документирует, почему. Комментарий к исправлению в k8s_tenant.rs объясняет, что более ранний резервный вариант ошибочно указывал на postgresql:17.2. Причина, указанная в то время: стандартное изображение не будет включать pgvector, при проверке оказалась ложной. Оба изображения имеют pgvector: 0.8.0 в 17.2, 0.8.5 в 16-standard-bookworm, измеренном на кластере флота.

Реальный риск, описанный в самом комментарии, заключается в другом: CloudNativePG запрещает любое понижение основной версии после создания кластера. Парк, подготовленный по ошибке в Postgres 17, будет необратимым, тогда как все, что было проверено сквозной проверкой в ​​Aurabase, было в Postgres 16.

k8s_tenant.rs (упрощенная выписка)rust
// Основная версия сохраняется, если TENANT_POSTGRES_IMAGE не определен.
let repli = "ghcr.io/cloudnative-pg/postgresql:16-standard-bookworm";

tracing::warn!(
    image = repli,
    "TENANT_POSTGRES_IMAGE non défini : repli sur la version validée."
);

Это не приговор Postgres 17 как таковому. Это политика эксплуатационной осмотрительности: не переводите производственный парк на основную версию до тех пор, пока не будет проведена сквозная проверка. Те же рассуждения применимы к любой команде, которая управляет Postgres через CloudNativePG или эквивалентного оператора Kubernetes. Вопрос не только в ожидаемом приросте производительности, но и в пути назад, если что-то пойдет не так.

Нет отката на основной версии

PostgreSQL не предлагает понижение основных версий. pg_upgrade мигрирует только в одном направлении, а CloudNativePG применяет то же ограничение на уровне своего оператора. Единственный способ вернуться — восстановить резервную копию, созданную до обновления, или начать с нового экземпляра в старой версии.

Стоит ли вам перейти на Postgres 17 или 18 сейчас?

Три критерия позволяют принять решение, не дожидаясь универсальной цифры. Во-первых, размер и скорость изменения ваших самых больших таблиц: если VACUUM уже выполняется в несколько проходов, рабочий сайт памяти Postgres 17 применяется непосредственно к вашему случаю. Затем ваше хранилище: на локальном SSD с низкой задержкой асинхронный ввод-вывод Postgres 18 обеспечивает меньше, чем на сетевом томе. Наконец, ваш путь назад: для оператора, который запрещает существенное понижение версии, тестирование сначала на одноразовой среде не является дополнительной мерой предосторожности.

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

#
Часто задаваемые вопросы

Что нас спрашивают чаще всего

Postgres 17 быстрее, чем Postgres 16 в обычном использовании?+
Не равномерно. Конкретный выигрыш сосредоточен на двух конкретных моментах: памяти, используемой VACUUM для больших таблиц, и конкуренции при соединениях с высоким уровнем параллелизма. На небольшой нагрузке небольшими столами разница остается едва заметной.
Можем ли мы вернуться с Postgres 17 или 18 на Postgres 16 после обновления?+
Нет, не напрямую. PostgreSQL не предлагает понижение основной версии после завершения обновления: pg_upgrade мигрирует только в одном направлении. Единственный возможный возврат — восстановить резервную копию до обновления или начать с нового экземпляра в старой версии.
Включен ли асинхронный ввод-вывод Postgres 18 по умолчанию?+
Подсистема существует по умолчанию, но с io_method=worker (процессами, предназначенными для ввода-вывода), а не с io_uring. io_uring остается опцией в Linux, которую нужно активировать явно, когда Postgres скомпилирован с этой поддержкой.
Какую версию Postgres сегодня использует Aurabase?+
Postgres 16.15, две трети (общая база и выделенная база для каждого проекта), проверено в docker/Postgres.Dockerfile и docker/Postgres.CNPG.Dockerfile 24 августа 2026 г. Это не постоянное ограничение, а только текущее состояние сквозной проверки.
#
В итоге

Производительность имеет меньшее значение, чем обратимость

Выбор между Postgres 16, 17 и 18 заключается не только в том, какая версия «самая быстрая». Postgres 17 устраняет реальную структурную проблему VACUUM в больших таблицах и уменьшает конфликты при высоком уровне параллелизма. Postgres 18 идет дальше с асинхронным вводом-выводом — архитектурным изменением, которое требует тестирования на фактической нагрузке и хранилище, прежде чем его обобщать.

Критерием, который чаще всего забывают, является не производительность, а обратимость. У такого оператора, как CloudNativePG, обновление основной версии не отменяется постфактум. Прежде чем переключать производственный парк, реальный вопрос заключается не только в ожидаемой выгоде, но и в пути возврата, если испытание не пройдено. Если вы готовитесь к обновлению этой версии, в нашем контрольном списке настройки Postgres в рабочей версии подробно описаны настройки, которые необходимо проверить после основного изменения версии.

ГОТОВЫ К РАЗВЕРТЫВАНИЮ?

Ваш бэкэнд за пять минут.

Кредитная карта не требуется · 500 МБ бесплатно · 50 000 MAU