Релиз СУБД PostgreSQL 9.5

После года разработки представлена новая стабильная ветка СУБД PostgreSQL 9.5 (русскоязычный пресс-релиз). Выпуск обновлений для ветки 9.5 будет осуществляться в течение пяти лет до января 2021 года.

Основные новшества:

  • Функциональность «UPSERT» (добавить-или-модифицировать), реализованная через новое выражение «INSERT … ON CONFLICT DO NOTHING/UPDATE», позволяющая обработать ситуацию невозможности добавления данных через «INSERT», например, из-за нарушения условий уникальности или недопустимости значения одного из полей. Вместо вывода ошибки теперь можно игнорировать выполнение оператора или изменить связанные с ключевым полем данные (т.е. если запись уже существует, вместо INSERT выполнить UPDATE);
  • Ограничение доступа на уровне строк (Row-Level Security, RLS). Доступ пользователей к данным в таблице теперь можно разграничивать на уровне отдельных строк, например, можно запретить определённой категории пользователей просмотр строк, в которых хранятся данные, добавленные другим пользователем. Для активации RLS следует использовать директиву «ALTER TABLE tablename ENABLE ROW LEVEL SECURITY», после чего следует задать правила доступа при помощи выражения «CREATE POLICY»;
  • BRIN-индексы («индексы блоковых зон», Block Range Index), позволяющие сверхкомпактно индексировать очень большие таблицы, без применения традиционных B-деревьев. Суть BRIN-индексов сводится к разбиению общего индекса на блоки, каждый из которых содержит данные индекса только для определённого диапазона значений. В тесте подобный метод оказался примерно в два раза медленнее b-деревьев при осуществлении операций выборки данных, но в 3–4 раза быстрее при создании и обновлении индекса, а также занял значительно меньше места на диске (64 Кб против 28 Мб);
  • Новые функции и операторы для типа данных JSONB. Для изменения значений в документе JSONB теперь можно обойтись без извлечения и переопределения всего документа, благодаря появлению функции jsonb_set (). Также добавлены функции json_strip_nulls (удаление атрибутов, содержащих значения NULL) и jsonb_pretty (вывод в отформатированном JSON). Добавлен оператор »||» для соединения двух значений JSONB;
  • Инструмент pg_rewind, позволяющий существенно упростить процесс восстановления отказоустойчивых конфигураций после переключения на резервный сервер. После возвращения в строй основного сервера возникает задача синхронизации его состояния с продолжившим работу запасным сервером, который успел накопить свою порцию изменений. Утилита pg_rewind пытается восстановить состояние первичного сервера по WAL-логу транзакций, перебирая их начиная с момента незадолго до сбоя, определяя изменённые данные и перенося только изменившиеся блоки, что позволяет обойтись без восстановления полной копии с работающего резервного сервера.
  • Существенные оптимизации скорости сортировки и хэширования в памяти. Благодаря применению нового метода сортировки строковых значений и чисел, удалось увеличить скорость индексации в три раза;
  • Автоматизированное управление размером лога транзакций. Возможность исключения отражения таблиц в логе транзакций (ALTER TABLE … SET LOGGED / UNLOGGED);
  • Аналитические возможности «GROUPING SETS», «CUBE» и «ROLLUP», позволяющие формировать вывод с группировкой по набору полей и рассчитывать число комбинаций различных категорий;
  • Улучшения репликации и средств повышения отказоустойчивости;
  • Множественные улучшения в механизме Foreign Data Wrappers, включая выражение «IMPORT FOREIGN SCHEMA», которое позволяет автоматизировать импорт всех связанных внешних таблиц для уже существующих таблиц с выбранной меткой сервера. Кроме того, обеспечена возможность наследования внешних таблиц в локальных таблицах и наоборот, например, «CREATE local_customers () inherits (remote.customers);»
  • В утилиту vacuumdb добавлена опций »-j», позволяющая запускать VACUUM в несколько одновременно выполняемых потоков;
  • Существенные улучшения масштабирования на системах с большим количеством процессорных ядер и оперативной памяти.

© OpenNet