Урок 1. Что нового в PostgreSQL 15 и далее (15 -> 16 -> 17)

Рейтинг: 72.2% · 10 голосов
Подробный курс по PostgreSQL: SQL по демобазе, типы данных и JSONB, индексы, транзакции и MVCC, VACUUM, EXPLAIN и планировщик, роли и привилегии, репликация, бэкап, настройка под нагрузку и под 1С. Актуально на 2026.
Ответить
Аватара пользователя
Egor_DBA
Сообщения: 47
Зарегистрирован: 11 май 2026, 05:31

Урок 1. Что нового в PostgreSQL 15 и далее (15 -> 16 -> 17)

Сообщение Egor_DBA »

Оглавление курса (47)
  1. Что такое PostgreSQL: история, философия, где применяется
  2. Урок 1. Что нового в PostgreSQL 15 и далее (15 -> 16 -> 17) (вы здесь)
  3. Установка и первый запуск: Linux, Windows, Docker
  4. psql детально: метакоманды и работа в консоли
  5. Демобаза Авиаперевозки Postgres Pro: структура и развёртывание
  6. SELECT: проекция, фильтрация, сортировка
  7. Транзакции и ACID
  8. Уровни изоляции транзакций: Read Committed, Repeatable Read, Serializable
  9. Соединения таблиц (JOIN)
  10. Агрегация: GROUP BY, HAVING, GROUPING SETS
  11. Подзапросы и CTE (WITH), рекурсия
  12. Оконные функции
  13. Изменение данных: INSERT/UPDATE/DELETE, UPSERT, MERGE
  14. Числовые и булевы типы, NULL и трёхзначная логика
  15. Строки, текст, дата и время, таймзоны
  16. Массивы, диапазоны, enum, составные типы
  17. JSON и JSONB: операторы и индексация
  18. DDL: CREATE TABLE, схемы, ALTER
  19. Ограничения целостности
  20. Представления и материализованные представления
  21. Последовательности, IDENTITY, генерируемые столбцы
  22. Индексы: B-tree и когда индекс не используется
  23. Типы индексов: Hash, GiST, SP-GiST, GIN, BRIN
  24. Продвинутые индексы: частичные, по выражению, покрывающие
  25. Обслуживание индексов и таблиц: bloat, REINDEX, CONCURRENTLY
  26. Полнотекстовый поиск
  27. Роли и пользователи
  28. Привилегии: GRANT/REVOKE
  29. Row-Level Security и безопасность данных
  30. Подключение приложения: pg_hba.conf, SSL, пулы соединений
  31. Серверное программирование: функции и процедуры
  32. Триггеры и события
  33. Архитектура PostgreSQL: процессы и память
  34. MVCC: версии строк и видимость
  35. VACUUM, autovacuum, freeze и wraparound
  36. WAL, контрольные точки и долговечность
  37. Блокировки и взаимоблокировки
  38. Планировщик запросов
  39. EXPLAIN и EXPLAIN ANALYZE: чтение планов
  40. Конфигурация сервера: ключевые параметры
  41. Настройка под нагрузку и под 1С
  42. Параллельные запросы и партиционирование
  43. Резервное копирование и восстановление
  44. Репликация: потоковая и hot standby
  45. Логическая репликация и кластерные решения
  46. Внешние данные, расширения и сертификация
  47. Разбор планов запросов на explain.tensor.ru: глубокое чтение EXPLAIN ANALYZE
Урок 1. Что нового в PostgreSQL 15 и далее (15 -> 16 -> 17)

Прежде чем нырять в типы данных, индексы, vacuum и explain analyze, полезно понять, на какой именно postgresql вы работаете и почему это важно. Версия определяет, какие команды у вас вообще есть и как ведут себя дефолты. В этом уроке мы разберем ключевые новшества PostgreSQL 15, которые мы берем за базу курса, и пройдемся по тому, что докрутили в 16 и 17. Заодно научимся ориентироваться в нумерации версий и сроках поддержки, чтобы не оказаться на ветке, которую завтра перестанут чинить.

Изображение

Как это работает

С 2017 года PostgreSQL ушел от схемы вида 9.6 к простой нумерации: 15, 16, 17 - это мажорные релизы, по одному в год, обычно осенью. Третья цифра (15.4, 16.2) - это минорный, чисто исправления багов и дыр безопасности, без новых фич и без изменения формата данных на диске. Минорный накатывается простой заменой бинарников и рестартом, мажорный требует pg_upgrade или дампа, потому что внутренний формат может поменяться.

Каждый мажорный релиз живет 5 лет. Грубая прикидка на 2026 год: PG 15 поддерживается примерно до конца 2027, PG 16 - до конца 2028, PG 17 - до конца 2029. Когда ветка выходит из поддержки, минорные обновления для нее перестают выпускать, и вы остаетесь с незакрытыми уязвимостями. Сидеть на 11 или 12 в 2026 - плохая идея.

Главная философия свежих версий - меньше ручной возни и больше безопасных дефолтов. Поэтому в 15 поменяли права на схему public, выкатили команду MERGE, ускорили логическую репликацию и сжали WAL. В 16 и 17 упор сделали на масштабирование чтения, параллелизм и заметно более быстрый VACUUM.

SQL и примеры

Сначала всегда смотрите, где вы находитесь. Две формы - короткая строка и разобранные по полочкам параметры.

Код: Выделить всё

SELECT version();
SHOW server_version;
SHOW server_version_num;   -- 150004 значит 15.4
Ключевое изменение 15, на которое все натыкаются. Раньше любой пользователь мог создавать объекты в схеме public. Теперь по умолчанию нельзя - право CREATE с public снято, и при попытке создать таблицу можно получить отказ. Поэтому в новой базе явно выдаем права нужной роли.

Код: Выделить всё

-- в свежей базе PG 15+ обычная роль не может писать в public
GRANT CREATE, USAGE ON SCHEMA public TO app_user;
MERGE - давно ожидаемая команда, которая в одном операторе делает вставку, обновление и удаление в зависимости от того, нашлось совпадение или нет. Возьмем демобазу Авиаперевозки (схема bookings) и представим, что подтягиваем актуальные посадочные места из staging-таблицы в seats.

Код: Выделить всё

MERGE INTO seats AS t
USING staging_seats AS s
  ON t.aircraft_code = s.aircraft_code AND t.seat_no = s.seat_no
WHEN MATCHED AND s.removed THEN
  DELETE
WHEN MATCHED THEN
  UPDATE SET fare_conditions = s.fare_conditions
WHEN NOT MATCHED THEN
  INSERT (aircraft_code, seat_no, fare_conditions)
  VALUES (s.aircraft_code, s.seat_no, s.fare_conditions);
Современный способ автонумерации - GENERATED IDENTITY вместо устаревшего serial. Это стандарт SQL, права наследуются чище и поведение предсказуемее.

Код: Выделить всё

CREATE TABLE flight_log (
  id    bigint GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
  msg   text NOT NULL,
  at    timestamptz NOT NULL DEFAULT now()
);
Что появилось дальше. В 16 логическую репликацию можно запускать с физической реплики (standby), что разгружает мастер. В 17 завезли встроенную функцию pg_createsubscriber для быстрого старта подписки. И в 16, и в 17 серьезно прокачали SQL/JSON - конструкторы и предикаты по стандарту, что упрощает работу с jsonb.

Код: Выделить всё

-- стиль SQL/JSON, активно расширявшийся в 16 и 17
SELECT JSON_OBJECT('flight': flight_no, 'status': status)
FROM flights
WHERE status = 'Arrived'
LIMIT 5;
В 17 переписали внутренности VACUUM - новая структура хранения мертвых ссылок уменьшила потребление памяти и ускорила уборку на больших таблицах. Для нагруженных баз и для postgresql для 1с, где много апдейтов и пухнет bloat, это ощутимый выигрыш.

Частые грабли
  • Путают мажор и минор. Накатили 15.6 поверх 15.4 и ждут новых фич - их там нет, только багфиксы. Новые возможности приходят только с мажором.
  • Обновили бинарники на новый мажор и удивляются, что база не стартует. Между мажорами нужен pg_upgrade или dump/restore, простой заменой пакетов не обойтись.
  • После установки PG 15 ловят permission denied на CREATE TABLE и считают это багом. Это новое поведение public schema, нужен явный GRANT.
  • Думают, что MERGE атомарно решит гонки как UPSERT. Для строгих гонок по уникальному ключу по-прежнему надежнее INSERT ... ON CONFLICT.
  • Тащат в новый код serial. Он не запрещен, но GENERATED IDENTITY - более правильный и переносимый выбор на 2026.
  • Сидят на снятой с поддержки версии и не накатывают минорные обновления, копя уязвимости.
Мини-лаба
  • Узнайте свою версию: SELECT version(); и SHOW server_version_num; - запишите мажор и минор.
  • Создайте роль: CREATE ROLE lab LOGIN PASSWORD 'lab'; и попробуйте от ее имени создать таблицу в public - поймайте отказ прав на PG 15+.
  • Выдайте право GRANT CREATE, USAGE ON SCHEMA public TO lab; и повторите создание - теперь должно пройти.
  • Создайте таблицу с bigint GENERATED ALWAYS AS IDENTITY и вставьте пару строк без указания id.
  • Сделайте простую staging-таблицу и выполните MERGE в свою таблицу, проверив ветки MATCHED и NOT MATCHED.
  • Запустите EXPLAIN на любом своем запросе и просто посмотрите на план - детально разберем его в следующих уроках.
  • Зайдите на postgresql.org/support/versioning и сверьте дату конца поддержки своей версии.
Контрольные вопросы
  • Чем отличается мажорное обновление от минорного и что требуется для каждого?
  • Какое изменение в правах схемы public принес PostgreSQL 15 и как теперь дать роли возможность создавать объекты?
  • Что делает команда MERGE и чем она отличается от INSERT ... ON CONFLICT?
  • Почему GENERATED IDENTITY предпочтительнее serial в новом коде?
  • Какие улучшения логической репликации появились в 16 и 17?
  • Как узнать срок окончания поддержки вашей версии и почему на этот срок надо смотреть?
👍5 ❤️3 🔥 😄 🤔1
Аватара пользователя
u3m7waft
Сообщения: 1
Зарегистрирован: 11 май 2026, 10:02

Re: Урок 1. Что нового в PostgreSQL 15 и далее (15 -> 16 -> 17)

Сообщение u3m7waft »

А serial теперь прям совсем нельзя? У нас весь старый код на нем, переписывать на identity ради чего - просто чище или реально что-то ломается?
👍 ❤️ 🔥 😄 🤔1
Аватара пользователя
gpuninja
Сообщения: 1
Зарегистрирован: 14 май 2026, 13:16

Re: Урок 1. Что нового в PostgreSQL 15 и далее (15 -> 16 -> 17)

Сообщение gpuninja »

Поймал тот самый permission denied на public после переезда на 15, час думал что роль битая. Оказалось дефолт сменился, GRANT CREATE решил. Спасибо что предупредили заранее.
👍1 ❤️1 🔥2 😄 🤔
Ответить
← Предыдущая глава
Что такое PostgreSQL: история, философия, где применяется
Следующая глава →
Установка и первый запуск: Linux, Windows, Docker

Все главы курса «PostgreSQL: от первого запроса до продакшена»

Поделиться темой: ✈ Telegram VK
Похожие запросы: autovacuum не успевает как настроить postgresqlкак читать план запроса explain analyze в postgresqlpostgresql не использует индекс делает seq scanтриггеры и хранимые процедуры pl/pgsql в postgresqlбэкап и восстановление postgresql через pg_dumpнастройка postgresql под 1с и высокую нагрузку

Вернуться в «PostgreSQL: от первого запроса до продакшена»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 2 гостя