На самом деле прошло уже два дня, но статью на Хабр никто до сих пор не написал, так что придется мне устранять это упущение, что и делаю с удовольствием.


Итак, что же нового в этой версии PostgreSQL?


Во-первых, изменилось само версионирование. До "десятки" мы наблюдали множество минорных версий 9.x, которые выходили примерно раз в год и при этом вносили серьезные, далеко не минорные изменения. Поэтому с версии 10 было принято решение сделать нумерацию 10, 11, 12 и т.д. Кстати, MySQL, похоже пошел по тому же пути, прыгнул с 5.7 на 8.0


Ладно, это всё мелочи, перейдем к существу вопроса


Логическая репликация


Это то, чего все ждали давным-давно. Замена различным расширениям а ля slony (репликация на триггерах) и другим костылям.


Теперь вы можете из коробки делать репликацию отдельных таблиц на другие базы.


Репликация делается с помощью команд CREATE PUBLICATION и CREATE SUBSCRIPTION. Всё достаточно просто.


Понятно, что фича достаточно новая, поэтому на данный момент в логической репликации отсутствуют некоторые фичи.


  • нет репликации схемы/DDL
  • нет репликации сиквенсов
  • не реплицируется команда TRUNCATE

Тем не менее это все равно огромный шаг вперед, в каких-то случаях можно выкинуть slony!


Партиционирование


Если раньше партиции можно было накостылять через наследование таблиц, то в десятке появилось для этого встроенное средство, которое называется declarative partitioning.


Для этого у главной таблицы добавляется ключевое слово PARTITON BY RANGE (или LIST), которое говорит, что эта таблица партициирована (или как это правильно сказать по-русски?).


У конкретных партиций с помощью выражения PARTITION OF ... FOR VALUES FROM (...) TO (...) задается диапазон их данных.


У партиций есть ряд ограничений, которые стоит иметь в виду, прежде чем использовать на продакшене: Limitations of declarative partitioning in PostgreSQL 10


Identity columns


Если вкратце, то появилась возможность пи��ать


id int GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY

вместо


id serial PRIMARY KEY 

Что это дает?
Дело в том, что слово serial — это грубо говоря алиас к конструкции DEFAULT nextval('имя сиквенса'). Т.е. по сути таблица отдельно, сиквенс отдельно. Это бывает удобно, а бывает нет. Например, это приводит к тому, что если вы даете права на вставку в таблицу (GRANT INSERT), вам приходится еще отдельно давать гранты на сиквенс.


Кстати, новая запись соответствует стандарту SQL.


Прочее


  • Улучшился паралеллизм, в частности Parallel Bitmap Heap Scan, Parallel Index Scan, Parallel Merge Join и т.д. Подробно можно прочесть в блоге Роберта Хааса
  • Улучшена производительность физической репликации
  • Hash-индексы стали реплицируемы
  • Поддержка полнотекстового поиска на jsonb колонках
  • SCRAM-аутентификация
  • улучшенная поддержка работы с xml
  • улучшен планировщик запросов при использовании join: если планировщик поймет, что объединенные строки не могут произвести в джойне больше одной строки, то можно не тратить лишнее время на поиск других строк. Примеры запросов можно посмотреть в тестах этого комита

Полный список изменений можно посмотреть здесь.


Если кто-то уже успел попробовать v10 в бою, поделитесь, плиз, своими впечатлениями в комментариях.


UPDATE. Есть мнение, что система версий не очень. Надо было называть PostgreSQL X, чтобы быть в тренде :)