Состоялся релиз новой СУБД PostgreSQL 12: что нового?

09.10.2019 11:59:00
Поделиться
Ссылка скопирована

Из интересных нововведений 12-й версии:

·         Увеличена производительность индексирования. Индексы B-tree оптимизировали для случаев частого изменения — в тестах это позволило улучшить общую производительность на 40 %.

·         JIT-компилятор включён по умолчанию, это увеличит скорость выполнения выражений при обработке SQL-запросов.

·         Появилась поддержка хранимых «генерируемых столбцов». Это столбцы, содержимое которых вычисляется по выражению, основанному на содержимом других столбцов в этой таблице.

·         Оптимизировано секционирование для запросов на основе таблиц с большим количеством секций, если при этом запрос ограничивается определённым подмножеством данных.

·         Появилась поддержка автоматического inline-развёртывания обобщённых табличных выражений (Common Table Expression, CTE). Это должно повысить производительность большинства запросов. Пока используется только для нерекурсивных CTE.

·         При аутентификации через GSSAPI канал связи теперь шифруется и на серверной, и на клиентской стороне.

 

Более подробный список новшеств можете посмотреть ниже (источник – документация Postgres Pro)

В число ключевых усовершенствований PostgreSQL 12 входят:

·         Общая оптимизация производительности, в частности:

o    Оптимизация размера на диске и производительности записи/чтения индексов-B-деревьев

o    Оптимизация производительности секционирования, в том числе ускорение запросов с таблицами, разбитыми на тысячи секций, увеличение скорости добавления данных командами INSERT и COPY, а также реализация возможности выполнения ALTER TABLE ATTACH PARTITION без блокирования других запросов

o    Автоматическое встраивание в запрос общих табличных выражений (CTE), с возможностью переопределения этого поведения

o    Уменьшение нагрузки на WAL при создании индексов GiSTGIN и SP-GiST

o    Поддержка покрывающих индексов GiST, реализуемая предложением INCLUDE

o    Возможность создания командой CREATE STATISTICS многоколоночной статистики самых частых значений (MCV), что позволяет получать лучшие планы для запросов, проверяющих значения нескольких столбцов с неравномерным распределением

·         Улучшения функциональности администрирования, в том числе:

o    Команда REINDEX CONCURRENTLY может перестраивать индекс, не блокируя запись в целевую таблицу

o    Утилита pg_checksums может включать/отключать контрольные суммы (позволяющие выявлять повреждения данных) в остановленном кластере

o    Вывод информации о процессе выполнения команд CREATE INDEXREINDEXCLUSTERVACUUM FULL и pg_checksums

·         Поддержка языка путей SQL/JSON

·         Хранимые в базе генерируемые столбцы

·         Недетерминированные правила сортировки на базе ICU, позволяющие выполнять группировку и сравнение строк без учёта регистра и знаков ударения

·         Новые возможности аутентификации, в том числе:

o    Шифрование соединений TCP/IP при аутентификации с использованием GSSAPI

o    Обнаружение адресов серверов LDAP в записях DNS SRV (Томас Мунро)

o    Многофакторная проверка подлинности при использовании варианта clientcert=verify-full с дополнительным методом аутентификации в pg_hba.conf

Миграция на версию 12

Тем, кто хочет мигрировать данные из любой предыдущей версии, необходимо выполнить выгрузку/загрузку данных с помощью pg_dumpall или воспользоваться pg_upgrade.

В версии 12 реализован ряд изменений, которые могут повлиять на совместимость с предыдущими выпусками. Рассмотрите следующие несовместимые аспекты:

  • Ликвидация специальных столбцов oid (Андрес Фройнд, Джон Нейлор)

Ранее в таблицу можно было добавить столбец oid (невидимый в обычных запросах), создавая её с указанием WITH OIDS; теперь такой возможности нет. При этом по-прежнему возможно создавать столбцы с типом oid. С учётом этого изменения порядок использования таблиц, созданных с указанием WITH OIDS, потребуется скорректировать.

Системные каталоги, в которых были скрытые столбцы oid, теперь содержат обычные столбцы oid. Таким образом, эти столбцы будут выводиться в результате запроса SELECT *, тогда как ранее они выводились только в случае явного указания.

  • Удаление типов данных abstime, reltime и tinterval (Андрес Фройнд)

Их заменяют типы, определённые в стандарте SQL, например timestamp.

  • Удаление расширения timetravel (Андрес Фройнд)
  • Перенос параметров recovery.conf в postgresql.conf (Масао Фудзии, Саймон Риггс, Абхиджит Менон-Сен, Сергей Корнилов)

Файл recovery.conf более не используется, и сервер не запустится, если обнаружит его. Теперь для переключения сервера из режима ведущего используются файлы recovery.signal и standby.signal. Параметр trigger_file был переименован в promote_trigger_file, а параметр standby_mode удалён.

  • Недопущение конфликта множественных указаний recovery_target* (Питер Эйзентраут)

А именно, допускается только одно из указаний recovery_targetrecovery_target_lsnrecovery_target_namerecovery_target_time или recovery_target_xid. Ранее в конфигурации могли присутствовать несколько этих параметров, а действовало только последнее вхождение. Сейчас может задаваться только один, хотя если он задаётся неоднократно, действует так же только последнее указание.

  • Переход в процессе восстановления по умолчанию к последней линии времени (Питер Эйзентраут)

То есть параметр recovery_target_timeline теперь имеет значение по умолчанию latest. Ранее подразумевалось значение current.

Исправленная реализация может выдавать более точные результаты, несколько отличающиеся от прежних. В частности, операции со значениями NaN, а также переполнение или антипереполнение теперь обрабатываются более согласованным образом.

  • Увеличение скорости вывода значений real and double precision благодаря использованию нового алгоритма (Эндрю Гирт)

Ранее выводимые числа с плавающей точкой округлялись по умолчанию до 6 или до 15 цифр (для типов real и double precision, соответственно); другая точность могла задаваться значением extra_float_digits. Теперь же при любом положительном значении extra_float_digits (по умолчанию сейчас выбрано такое значение) выводится только минимальное количество цифр, которое требуется для сохранения точного двоичного представления числа. При нулевом или отрицательном значении extra_float_digits поведение осталось прежним.

Кроме того, на всех платформах теперь одинаково выводится экспонента числа с плавающей точкой: для неё выделяются две цифры, если этого достаточно, а иначе — три. В предыдущих версиях на платформе Windows всегда выводились три цифры.

  • Поведение random() и setseed() стало единообразным на всех платформах (Том Лейн)

Последовательность значений random(), получаемая после вызова setseed() с определённой затравкой, скорее всего будет отличаться от выдаваемой предыдущими версиями. Однако она будет повторяемой, что раньше не гарантировалось в случае параллельного использования генератора случайных чисел внутри сервера. Для обеспечения повторяемости SQL-функция random() теперь сохраняет собственное состояние в рамках сеанса.

  • Изменение поведения функции substring(), вызываемой в стиле SQL, на соответствующее стандарту, «жадное» (Том Лейн)

В случаях, когда искомый шаблон может быть выбран в строке несколькими способами, начальному сегменту шаблона сопоставляется не наибольшая, а наименьшая подстрока; например, шаблон %#"aa*#"% теперь выбирает из входной строки не последнее, а первое вхождение ряда a.

  • Сохранение исходного форматирования результата функции xpath() или конструкции XMLTABLE (Том Лейн)

При некоторых условиях эти функции могли вставлять в значения узлов дополнительные пробельные символы (пробелы и/или переводы строк). Однако в общем случае это нежелательно, так как пробельные символы в определённых сценариях использования могут быть значимыми.

  • Переименование утилиты командной строки pg_verify_checksums в pg_checksums (Микаэль Пакье)
  • Добавление в pg_restore требования ключа -f - для получения содержимого дампа через стандартное устройство вывода (Эйлер Тавейра)

Ранее дамп выводился в стандартное устройство вывода и тогда, когда назначение не указывалось, но это было признано нежелательным поведением.

  • Недопущение неоднозначных сокращений в команде \pset format утилиты psql (Даниэль Верите)

Ранее, например, при вводе команды \pset format a выбирался вариант aligned; однако возможен и вариант asciidoc, поэтому теперь не будет выбираться никакой.

  • В новых индексах btree максимальный размер записи индекса сокращён на 8 байт с целью усовершенствования обработки повторяющихся элементов (Питер Гейган)

Вследствие этого при выполнении REINDEX с индексом, полученным в результате обновления предыдущей версии с применением pg_upgrade, может возникнуть ошибка.

  • Прерывание ошибкой выполнения команды DROP IF EXISTS FUNCTION/PROCEDURE/AGGREGATE/ROUTINE в случаях, когда ей не передаётся список аргументов, а указанному имени соответствуют несколько объектов (Дэвид Роули)

Также улучшена формулировка сообщения о такой ошибке.

  • Разделение каталога pg_statistic_ext на два и добавление представления pg_stats_ext над новыми каталогами (Дин Рашид, Томаш Вондра)

Благодаря этому появилась возможность скрыть от непривилегированных пользователей данные статистики, потенциально содержащие конфиденциальную информацию.

  • Удаление ненужного столбца pg_constraint.consrc (Питер Эйзентраут)
  • Удаление ненужного столбца pg_attrdef.adsrc (Питер Эйзентраут)
  • Назначение столбцам, имеющим тип name, по умолчанию правила сортировки «C» (Том Лейн, Даниэль Верите)

Операторы сравнения для типа данных name могут теперь использовать любые правила сортировки, а не исключительно правило сортировки «C». Для сохранения предыдущего поведения запросов столбцы типа name теперь явно помечаются как имеющие правило сортировки «C». Это имеет и побочный эффект — операторы регулярных выражений со столбцами name теперь будут использовать по умолчанию не правило сортировки, заданное для базы, а правило «C». В частности, это повлияет на поведение зависящих от локали элементов регулярных выражений (например, \w). Если вы хотите получить отличное от C поведение регулярного выражения со столбцом name, добавьте явное указание COLLATE. (Для создаваемых пользователем столбцов name также можно задать другое правило сортировки при создании таблицы; но при этом проблема обратной совместимости просто смещается в область операторов сравнения.)

  • Обработка столбцов, содержащих имена объектов в представлениях information_schema, как имеющих тип name, а не varchar (Том Лейн)

Согласно стандарту SQL столбцы с именами объектов в представлениях information_schema должны иметь доменный тип sql_identifier. В PostgreSQL нижележащие столбцы каталога фактически имеют тип name. В результате этого изменения тип sql_identifier оказывается доменом поверх типа name, а не varchar, как было раньше. Тем самым устраняется несоответствие при сравнении и сортировке, что значительно ускоряет поиск в представлениях information_schema по таким столбцам. Однако заметьте, что при проверке неравенства, например:


SELECT ... FROM information_schema.tables WHERE table_name < 'foo';


без дополнительных указаний будет использоваться правило сортировки, принятое для локали «C», а не правило сортировки, выбранное в текущей базе по умолчанию. Упорядочиваться значения этих столбцов так же будут по правилу «C». Старое (и неэффективное) поведение можно вернуть, добавив указание COLLATE "default".

  • Удаление возможности отключения динамической общей памяти (Кётаро Хоригути)

Таким образом, параметр dynamic_shared_memory_type теперь не может принимать значение none.

Изменения

Ниже вы найдёте подробный список изменений, произошедших между предыдущим основным выпуском и выпуском PostgreSQL 12.

Секционирование

  • Увеличение скорости выполнения многих операций с секционированными таблицами (Амит Ланготе, Дэвид Роули, Том Лейн, Альваро Эррера)

Способность эффективно выполнять в таблицах с тысячами дочерних секций операции, фактически затрагивающие лишь небольшое количество секций.

  • Возможность ссылаться во внешних ключах на секционированные таблицы (Альваро Эррера)
  • Ускорение операции COPY при копировании данных в секционированные таблицы (Дэвид Роули)
  • Возможность определения границ секций в виде произвольных выражений (Кётаро Хоригути, Том Лейн, Амит Ланготе)

Такие выражения вычисляются в момент создания секционированной таблицы. Ранее границы секций могли задаваться только простыми константами.

  • Распространение заданного в CREATE TABLE указания табличного пространства на дочерние секции секционированной таблицы (Дэвид Роули, Альваро Эррера)
  • Исключение избыточной сортировки при сканировании секций в нужном порядке (Дэвид Роули)
  • Выполнение ALTER TABLE ATTACH PARTITION с более мягкими требованиями блокировки (Роберт Хаас)
  • Реализация функций для просмотра конфигурации секционирования (Микаэль Пакье, Альваро Эррера, Амит Ланготе)

Новая функция pg_partition_root() выдаёт верхнюю таблицу в дереве секционирования, pg_partition_ancestors() выдаёт вышестоящие отношения секции, а pg_partition_tree() выводит информацию о секциях.

  • Включение секционированных индексов в системное представление pg_indexes (Сурадж Хараге)
  • Добавление в psql команды \dP, показывающей секционированные таблицы и индексы (Павел Стехуле)
  • Улучшение отображения секционированных таблиц в выводе команд \d и \z в psql (Павел Стехуле, Микаэль Пакье, Альваро Эррера)
  • Исправление ошибок, в результате которых после ALTER TABLE DETACH PARTITION схема зависимостей могла оказаться некорректной. Вследствие этого, например, при удалении таблицы, ранее являвшейся секцией, могли не удалиться её индексы (Том Лейн)

Индексы

  • Увеличение быстродействия и уменьшение размера индексов btree, содержащих множество повторяющихся значений (Питер Гейган, Хейкки Линнакангас)

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

Это улучшение не распространяется на индексы, полученные в результате обновления предыдущей версии с помощью pg_upgrade.

  • Реализация более компактного хранения многоколоночных индексов btree (Питер Гейган, Хейкки Линнакангас)

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

Это улучшение не распространяется на индексы, полученные в результате обновления предыдущей версии с помощью pg_upgrade.

  • Увеличение скорости добавления данных в индекс btree благодаря сокращению издержек, связанных с блокировками (Александр Коротков)
  • Поддержка дополнительных столбцов (INCLUDE) в индексах GiST (Андрей Бородин)
  • Реализация поддержки поиска ближайших соседей (KNN) с использованием индексов SP-GiST (Никита Глухов, Александр Коротков, Владислав Стержанов)
  • Уменьшение нагрузки на WAL при создании индексов GiST, GIN и SP-GiST (Анастасия Лубенникова, Андрей Лепихов)
  • Более эффективное выполнение сканирования только индекса применительно к индексам по нескольким столбцам (Константин Книжник)
  • Увеличение производительности сканирования при очистке индексов GiST (Андрей Бородин, Константин Кузнецов, Хейкки Линнакангас)
  • Удаление из индекса GiST пустых страниц на уровне листьев при выполнении VACUUM (Андрей Бородин)
  • Смягчение требований блокировки для переименования индекса (Питер Эйзентраут)

Оптимизатор

  • Возможность получения с помощью CREATE STATISTICS статистики самых частых комбинаций по нескольким столбцам (Томаш Вондра)

Такая статистика помогает оптимизировать запросы, в которых проверяются значения нескольких столбцов, когда требуется оценить эффект совмещения нескольких предложений WHERE. Если столбцы коррелируют между собой и характеризуются неравномерным распределением, многоколоночная статистика позволит получить гораздо более качественные оценки.

Выражение CTE автоматически встраивается во внешний запрос, если оно не имеет побочных эффектов, нерекурсивно и фигурирует в запросе однократно. Встраивание можно предотвратить, указав MATERIALIZED, либо наоборот, принудительно встроить фигурирующее многократно выражение, указав NOT MATERIALIZED. Ранее выражения CTE никогда не встраивались и всегда вычислялись до остального содержимого запроса.

  • Управление выбором общих планов при выполнении подготовленных операторов (Павел Стехуле)

Для реализации этой возможности введён серверный параметр plan_cache_mode.

  • Улучшение оптимизации запросов с секциями и с UNION ALL, когда в подплане оказывается только один потомок (Дэвид Роули)
  • Улучшение обработки доменов, у которых отсутствуют ограничения-проверки (Том Лейн)

Домены, представляющие собой просто синонимы типов, теперь не препятствуют оптимизации запросов.

  • Предварительное вычисление функций LEAST и GREATEST с постоянными аргументами (Вик Фиринг)
  • Улучшение способности планировщика определять, пригодны ли к использованию в запросах частичные индексы с условиями IS NOT NULL (Том Лейн, Джеймс Коулман)

Пригодность к использованию таких индексов теперь может быть определена в большем количестве случаев, когда в вызывающем запросе присутствуют приведения или объёмные конструкции x IN (массив).

  • Вычисление статистики ANALYZE с учётом правила сортировки, определённого для каждого столбца (Том Лейн)

Ранее для всех статистик использовалось правило сортировки, выбранное по умолчанию. Реализованное усовершенствование позволяет улучшить поведение оптимизатора при анализе столбцов с другими правилами сортировки.

  • Улучшение оценки избирательности при проверке неравенства со значениями столбцов ctid (Эдмунд Хорнер)
  • Улучшение оптимизации соединений по столбцам типа tid (Том Лейн)

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

  • Придание признака герметичности ряду операторов сравнения и опорных функций btree (Том Лейн)

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

Общая производительность

  • Активация JIT-компиляции по умолчанию, если сервер собирается с соответствующей поддержкой (Андрес Фройнд)

Заметьте, что эту поддержку нужно включать явно на этапе конфигурирования сборки.

  • Ускорение поиска ключевых слов
  • Увеличение скорости поиска многобайтовых символов в position() и связанных функциях (Хейкки Линнакангас)
  • Реализация распаковки значений TOAST в минимально необходимом объёме (Пол Рамсей)

Это полезно в случаях, когда достаточно прочитать только начало поля, упакованного в TOAST.

  • Исключение ненужного сканирования таблицы при выполнении ALTER TABLE ... SET NOT NULL (Сергей Корнилов)

Сканирование может не выполняться, когда из ограничений столбца следует, что он не может содержать NULL.

  • Устранение необходимости перезаписи таблицы при переходе между типами timestamp и timestamptz с помощью ALTER TABLE ... SET DATA TYPE, когда текущий часовой пояс сеанса — UTC (Ной Миш)

В часовом поясе UTC эти два типа данных являются двоично совместимыми.

  • Ускорение преобразования строк в целочисленные типы int2 и int4 (Андрес Фройнд)
  • Возможность распараллеливания запросов в режиме изоляции SERIALIZABLE (Томас Мунро)

Ранее в данном режиме распараллеливание запросов запрещалось.

  • Использование функций pread() и pwrite() для ввода/вывода в произвольной позиции (Оскари Сааренмаа, Томас Мунро)

Благодаря этому для операций ввода/вывода требуется выполнять меньше системных вызовов.

Мониторинг

  • Возможность регистрирования в журнале только некоторого процента транзакций (Адриен Найрат)

Доля транзакций задаётся параметром log_transaction_sample_rate.

  • Вывод информации о процессе выполнения операций CREATE INDEX и REINDEX (Альваро Эррера, Питер Эйзентраут)

Получить эту информацию можно через системное представление pg_stat_progress_create_index.

  • Вывод информации о процессе выполнения команд CLUSTER и VACUUM FULL (Тацуро Ямада)

Получить эту информацию можно через системное представление pg_stat_progress_cluster.

  • Вывод информации о процессе выполнения pg_checksums (Михаэль Банк, Бернд Хелмле)

Для получения этой информации добавьте ключ --progress.

  • Добавление счётчика ошибок контрольных сумм в представление pg_stat_database (Магнус Хагандер)
  • Добавление статистики глобальных объектов в системное представление pg_stat_database (Жюльен Руо)

В строке, показывающей глобальные объекты, поле pg_stat_database.datid равно нулю.

  • Предоставление возможности просматривать содержимое архивного каталога (Кристоф Мёнх-Тегедер)

Эту возможность реализует функция pg_ls_archive_statusdir().

  • Предоставление возможности просматривать содержимое временных каталогов (Натан Боссарт)

Эту возможность реализует функция pg_ls_tmpdir(), принимающая в качестве необязательного аргумента указание табличного пространства.

  • Добавление информации о клиентском сертификате в системное представление pg_stat_ssl (Питер Эйзентраут)

Эту информацию предоставляют новые столбцы client_serial и issuer_dn. Столбец clientdn для единообразия переименован в client_dn.

  • Ограничение видимости строк в pg_stat_ssl для непривилегированных пользователей (Питер Эйзентраут)
  • Вывод в журнал сообщения с номером версии сервера при запуске (Кристоф Берг)
  • Подавление сообщений «incomplete startup packet» (неполный стартовый пакет), выводимых в журнал при закрытии нового соединения до передачи данных (Том Лейн)

Это позволяет избавиться от лишних сообщений, порождаемых при определённых методах мониторинга.

  • Добавление в сообщения log_connections названия приложения (application_name), если оно задано
  • Использование в качестве альтернативного имени приложения walreceiver имени кластера, если оно задано
  • Добавление времени последнего полученного от ведомого сервера сообщения в представление pg_stat_replication 
  • Добавление события ожидания синхронизации с ФС сегментов WAL 

Аутентификация

  • Добавление поддержки шифрования средствами GSSAPI (Робби Харвуд, Стивен Фрост)

Новая функциональность позволяет шифровать соединения TCP/IP при использовании аутентификации GSSAPI, избавляя от необходимости применять отдельные средства шифрования, такие как SSL. В дополнение в pg_hba.conf добавлены типы записей hostgssenc и hostnogssenc (подобные существовавшим ранее типам hostssl и hostnossl), позволяющие выбрать соединения, которые используют либо не используют шифрование GSSAPI. Кроме того, реализовано новое системное представление pg_stat_gssapi и в libpq появился параметр gssencmode.

  • Реализация для параметра clientcert в pg_hba.conf варианта проверки, соответствует ли имя пользователя базы общему имени (cn), указанному в сертификате пользователя (Джулиан Маркворт, Мариус Тиммер)

Эту проверку включает значение clientcert=verify-full.

  • Возможность обнаружения адреса сервера LDAP в записях DNS SRV (Томас Мунро)

Это позволяет сделать указание ldapserver необязательным. Данный вариант поддерживается, только если PostgreSQL был собран с использованием OpenLDAP.

Конфигурация сервера

  • Реализация возможности включать/отключать контрольные суммы в кластере с помощью pg_checksums (Михаэль Банк, Микаэль Пакье)

Для выполнения этих операций кластер должен быть остановлен.

  • Уменьшение значения параметра autovacuum_vacuum_cost_delay по умолчанию до 2 мс (Том Лейн)

Благодаря этому операции автоочистки теперь по умолчанию будут выполняться быстрее.

  • Возможность указания дробных значений vacuum_cost_delay, позволяющая задавать задержку с долями миллисекунд (Том Лейн)
  • Возможность указания в параметрах сервера интервалов времени в микросекундах (us) (Том Лейн)
  • Допущение присвоения целочисленным параметрам сервера дробных значений (Том Лейн)

Например, теперь допускается присвоение значения SET work_mem = '30.1GB', хотя параметр work_mem является целочисленным. В этом случае значение будет округлено до целого после пересчёта в единицы измерения данного параметра.

  • Возможность указания единиц измерения для серверных параметров, имеющих тип числа с плавающей точкой (Том Лейн)
  • Добавление серверных параметров wal_recycle и wal_init_zero для управления переработкой файлов WAL (Джерри Джелинек)

От переработки файлов имеет смысл отказаться при использовании файловых систем, производящих копирование при записи, например ZFS.

  • Добавление серверного параметра tcp_user_timeout для управления тайм-аутом TCP-подключений (Рёхэй Нагаура)
  • Возможность ограничения минимальной и максимальной версии протокола SSL (Питер Эйзентраут)

Этой цели служат серверные параметры ssl_min_protocol_version и ssl_max_protocol_version.

  • Добавление серверного параметра ssl_library, позволяющего узнать версию библиотеки SSL, которая используется сервером (Питер Эйзентраут)
  • Добавление серверного параметра shared_memory_type для выбора типа используемой общей памяти (Андрес Фройнд)

Этот параметр позволяет явно выбрать механизм управления памятью System V, если это требуется.

Потоковая репликация и восстановление

  • Реализация возможности изменения ряда параметров восстановления при перезагрузке конфигурации

Эта возможность распространяется на параметры archive_cleanup_commandpromote_trigger_filerecovery_end_command и recovery_min_apply_delay.

  • Возможность установления тайм-аута потоковой репликации (wal_sender_timeout) для отдельного соединения

Ранее этот тайм-аут можно было задать только на уровне кластера.

  • Реализация функции pg_promote() для повышения ведомого сервера до ведущего

Раньше эту операцию можно было выполнить, только воспользовавшись pg_ctl или создав триггерный файл.

  • Реализация возможности копирования слотов репликации. Эту возможность предоставляют функции pg_copy_physical_replication_slot() и pg_copy_logical_replication_slot().
  • Исключение количества процессов max_wal_senders из max_connections (Александр Кукушкин)
  • Добавление явного значения current для recovery_target_timeline (Питер Эйзентраут)
  • Прерывание восстановления с ошибкой в случае повреждения файла состояния двухфазных транзакций 

Ранее выводилось предупреждение и восстановление продолжалось, в результате чего могли потеряться транзакции.

Служебные команды

  • Добавление предложения REINDEX CONCURRENTLY, позволяющего произвести переиндексирование, не блокируя запись (Микаэль Пакье, Андреас Карлссон, Питер Эйзентраут)

Также переиндексирование в неблокирующем режиме можно запустить, передав программе reindexdb ключ --concurrently.

Содержимое генерируемых столбцов вычисляется выражениями (в которых можно обращаться к другим столбцам той же таблицы), а не задаётся явно в командах INSERT или UPDATE.

  • Добавление в COPY FROM предложения WHERE, позволяющего ограничивать множество загружаемых строк (Сурафел Темесген)

В результате появился простой способ фильтровать поступающие данные.

  • Смягчение ограничений при добавлении значений перечисления (Эндрю Дунстан, Том Лейн, Томас Мунро)

Ранее ALTER TYPE ... ADD VALUE можно было выполнять в блоке транзакции, только если тип-перечисление создавался в той же транзакции. Сейчас эту операцию можно выполнить и позже, в другой транзакции, нельзя лишь обращаться к добавленному значению перечисления до фиксации этой транзакции.

  • Реализация команд, позволяющих сразу после завершения транзакции начать новую (Питер Эйзентраут)

Для организации цепочки транзакций предназначены команды COMMIT AND CHAIN и ROLLBACK AND CHAIN.

  • Добавление для VACUUM и CREATE TABLE параметров, позволяющих предотвратить отсечение последних пустых страниц в процессе VACUUM (Такаюки Цунакава)

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

  • Реализации возможности пропускать очистку индекса в процессе VACUUM (Масахико Савада)

В целях управления очисткой индекса был добавлен параметр INDEX_CLEANUP для команды VACUUM, а также параметр хранения таблиц vacuum_index_cleanup. Отключение очистки индексов помешает оптимизировать занимаемое ими пространство, что чревато раздуванием индексов, но может иметь смысл, когда в первую очередь требуется заморозить старые кортежи.

  • Добавление возможности пропускать операции VACUUM и ANALYZE для таблиц, которые не удаётся заблокировать немедленно (Натан Боссарт)

Предназначенное для этого новое указание называется SKIP_LOCKED.

  • Реализация возможности задавать для параметров VACUUM и ANALYZE необязательные логические значения (Масахико Савада)
  • Устранение требования блокировки командами TRUNCATE, VACUUM и ANALYZE для таблиц, к которым пользователь не имеет доступа (Микаэль Пакье)

Тем самым исключаются ситуации, когда не имеющий прав пользователь мог мешать выполнению запросов других пользователей.

  • Добавление для EXPLAIN указания SETTINGS, позволяющего увидеть нестандартные значения параметров оптимизатора (Томаш Вондра)

Эту информацию также может выдавать модуль auto_explain; для этого в нём предусмотрен параметр auto_explain.log_settings.

  • Реализация указания OR REPLACE для CREATE AGGREGATE (Эндрю Гирт)
  • Возможность изменения свойств системных каталогов с помощью ALTER TABLE (Питер Эйзентраут)

Теперь поддерживается изменение параметров reloptions и автоочистки для этих каталогов. (Это в любом случае требует включения режима allow_system_table_mods.)

  • Использование имён всех ключевых столбцов при формировании автоматического имени ограничения внешнего ключа (Питер Эйзентраут)

Ранее в имени ограничения использовалось имя только первого столбца, что порождало неоднозначность при создании внешних ключей, включающих несколько столбцов.

Типы данных

  • Приведение разнообразных представлений о Unicode в соответствие со стандартом Unicode 12.1.0 (Питер Эйзентраут)

В частности, это способствовало решению проблемы некорректного форматирования вывода с составными символами в psql.

  • Обновление словарей стеммера Snowball, включающее добавление поддержки новых языков (Артур Закиров)

Благодаря этому появилась возможность использовать при полнотекстовом поиске стеммер для арабского, индонезийского, ирландского, непальского и тамильского языков.

  • Возможность создания правил сортировки, позволяющих считать равными строки, которые не равны побитово (Питер Эйзентраут)

Таким образом реализована поддержка «недетерминированных» правил сортировки, которые могут определять сравнения без учёта регистра или знаков ударения. Благодаря этому проверка ограничения уникальности текстового столбца без учёта регистра может быть проще, чем раньше. Однако это поддерживают только правила сортировки ICU.

  • Поддержка атрибутов для правил сортировки ICU со старыми версиями ICU (Питер Эйзентраут)

Атрибуты позволяют настраивать правила сортировки так, чтобы они работали одинаково со всеми версиями ICU.

  • Возможность более прозрачного сравнения типа данных name с другими типами (Том Лейн)

Тип name теперь подобен домену поверх типа text с правилом сортировки «C». Это позволяет выполнять межтиповые сравнения более эффективно.

Функции

  • Реализация поддержки языка путей SQL/JSON (Никита Глухов, Фёдор Сигаев, Александр Коротков, Олег Бартунов, Людмила Мантрова)

Теперь можно выполнять сложные запросы к данным JSON, используя язык стандарта SQL.

Кроме того, для соответствия стандартам функция log() дополнительно получила альтернативное имя log10().

  • Улучшена точность статических агрегатных функций, например variance(), благодаря использованию более точных алгоритмов (Дин Рашид)
  • Добавление для date_trunc() необязательного аргумента, задающего часовой пояс (Вик Фиринг, Том Лейн)

Новая форма функции быстрее и проще в использовании, чем предложение AT TIME ZONE.

  • Изменение поведения функций to_timestamp()/to_date() на более гибкое в случае несоответствия строки шаблону (Артур Закиров, Александр Коротков, Людмила Мантрова)

Новое поведение в большей степени соответствует поведению одноимённых функций в Oracle.

  • Исправление разнообразных ошибок в XML-функциях (Павел Стехуле, Маркус Винанд, Чепмен Флэк)

В частности, в функциях xpath(), xmlexists() и XMLTABLE устранены аномалии, когда в качестве узла не выводилось ничего, выдавалась неожиданная ошибка или пропускались необходимые специальные символы XML.

  • Поддержка указания BY VALUE в конструкциях XMLEXISTS и XMLTABLE (Чепмен Флэк)

Это описанное в стандарте SQL указание не играет никакой роли в реализации PostgreSQL, но ранее оно безосновательно не принималось.

  • Недопущение выполнения параллельными исполнителями функций current_schema() и current_schemas(), не являющихся безопасными для распараллеливания (Микаэль Пакье)
  • Возможность использования RECORD и RECORD[] в качестве типов столбцов в списке определения столбцов запроса для табличной функции, объявленной как возвращающая RECORD (Элвис Пранскевичус)

 

Клиентские приложения

 

  • Реализация в vacuumdb возможности отбирать таблицы по горизонту видимости (Натан Боссарт)

Задать горизонт позволяют параметры --min-xid-age и --min-mxid-age.

  • Реализация в vacuumdb возможности исключить ожидание блокировок или не допустить пропуска полностью видимых страниц (Натан Боссарт)

Для этого предназначены параметры --skip-locked и --disable-page-skipping, соответственно.

  • Добавление цветового оформления вывода утилит командной строки (Питер Эйзентраут)

Вывод становится цветным, когда переменная окружения PG_COLOR имеет значение always или auto. Установить определённые цвета для различных типов информации можно, воспользовавшись переменной окружения PG_COLORS, в которой задаются цветовые спецкоды ANSI. Например, цветовое оформление по умолчанию выражается значением PG_COLORS="error=01;31:warning=01;35:locus=01".

 psql

  • Добавление в psql режима вывода таблиц в формате CSV (Даниэль Верите)

Этот режим включается командой \pset format csv или аргументом командной строки --csv.

  • Отображение адреса соответствующей страницы документации в выводе psql \help для SQL-команды (Питер Эйзентраут)
  • Отображение IP-адреса в выводе psql \conninfo (Фабьен Коэльо)
  • Улучшение дополнения табуляцией для команд CREATE TABLE, CREATE TRIGGER, CREATE EVENT TRIGGER, ANALYZE, EXPLAIN, VACUUM, ALTER TABLE, ALTER INDEX, ALTER DATABASE и ALTER INDEX ALTER COLUMN

 

pgbench

  • Реализация возможности присваивать выдаваемые запросами значения переменным pgbench (Фабьен Коэльо, Альваро Эррера)

Для этого предназначена команда \gset.

  • Увеличение точности параметра pgbench --rate (Том Лейн)
  • Улучшение информативности ошибок, выдаваемых программой pgbench, в частности, исправление текста сообщений и кодов выхода (Питер Эйзентраут)

Серверные приложения

  • Реализация возможности прокрутки файла журнала с помощью pg_ctl (Кётаро Хоригути, Александр Кузьменков, Александ Коротков)

Ранее эту операцию можно было выполнить только отправив сигнал процессу или вызвав SQL-функцию.

  • Отсоединение запускаемого серверного процесса при выполнении pg_ctl start (Пол Гуо)

Это предотвращает отключение сервера в случае последующего прерывания скрипта оболочки, в котором вызывалась команда pg_ctl.

  • Возможность использования в pg_upgrade функциональности клонирования, если таковая предоставляется файловой системой (Питер Эйзентраут)

Новый параметр --clone даёт те же преимущества, что и --link, но позволяет сохранить старый кластер в исходном состоянии после запуска нового.

  • Реализация возможности передать pg_upgrade путь каталога сокета (Даниэль Густафссон)

Этот каталог задаётся параметром --socketdir; по умолчанию подразумевается текущий каталог.

  • Возможность отключить в pg_checksums синхронизацию с ФС (Микаэль Пакье)

Для этого предназначен параметр --no-sync.

  • Возможность отключить в pg_rewind синхронизацию с ФС (Микаэль Пакье)
  • Исправление в pg_test_fsync измерения длительности open_datasync в Windows (Лауренц Альбе)

pg_dumppg_dumpallpg_restore

 

  • Возможность добавления в выводе pg_dump нескольких строк данных в одной команде INSERT, когда эти команды используются вместо COPY (Сурафел Темесген, Дэвид Роули)

Количество строк задаётся параметром --rows-per-insert.

  • Возможность получения в выводе pg_dump команд INSERT ... ON CONFLICT DO NOTHING (Сурафел Темесген)

Такая вариация позволяет избежать конфликтов при восстановлении; она включается параметром --on-conflict-do-nothing.

  • Отделение порядка операций в параллельном режиме pg_dump от порядка, в котором производит параллельное восстановление pg_restore (Том Лейн)

Это позволит pg_restore достигать большей степени распараллеливания, особенно в случах, когда данные выгружались не в параллельном режиме. Планирование заданий в параллельном режиме pg_dump также было улучшено.

  • Возможность указания параметра extra_float_digits для программ pg_dump и pg_dumpall (Эндрю Дунстан)

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

  • Добавление в pg_dumpall параметра --exclude-database (Эндрю Дунстан)

 

Дополнительные модули

 

  • Возможность передачи сортировки ORDER BY и предложения LIMIT сторонним серверам (postgres_fdw) в более разнообразных случаях (Эцуро Фудзита)
  • Внесение корректив в расчёт оценки стоимости, необходимых при использовании postgres_fdw (Эцуро Фудзита)
  • Исправление поведения представлений, обращающихся к таблицам postgres_fdw и имеющих свойство CHECK OPTION (Эцуро Фудзита)

Тогда как для таблиц postgres_fdw указание CHECK OPTION игнорируется (так как они являются удалёнными), обращающиеся к ним представления считаются локальными, и поэтому теперь для них проверяется выполнение указания CHECK OPTION. Ранее проверялись только результаты запросов INSERT и UPDATE с предложениями RETURNING, обращающихся к представлениям со свойством CHECK OPTION.

  • Возможность точечного сброса статистики с помощью pg_stat_statements_reset() (Харибабу Комми, Амит Капила)

Теперь эта функция позволяет сбрасывать статистику для определённой базы данных, пользователя или запроса.

  • Возможность управления уровнем детализации auto_explain (Том Дунстан, Эндрю Дунстан)

По умолчанию выбран уровень детализации LOG.

  • Обновление правил unaccent, включающее добавление новых знаков пунктуации и символов (Хью Раналли, Микаэль Пакье)
  • Реализация в unaccent обработки знаков ударения, представленных в составных символах (Хью Раналли)
  • Реализация в unaccent удаления знаков ударения из греческих символов (Тасос Масхалидис)
  • Добавление в функцию bt_index_parent_check() в модуле amcheck параметра для проверки каждого кортежа индекса, начиная от корня (Питер Гейган)
  • Приведение порядка обработки параметров oid2name и vacuumlo в соответствие с принятым в других командах (Тацуро Ямада)

Поделиться
Ссылка скопирована

Возврат к списку