E.80. Выпуск 9.5

Дата выпуска: 2016-01-07

E.80.1. Обзор

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

  • Возможность превращать команды INSERT, вызывающие конфликты ограничений, в команды UPDATE, либо игнорировать их

  • Добавление в GROUP BY аналитической функциональности: GROUPING SETS, CUBE и ROLLUP

  • Добавление механизма защиты на уровне строк

  • Создание механизмов для отслеживания прогресса репликации, включая средства идентификации источника отдельных изменений при логической репликации

  • Добавление блочно-зональных индексов (BRIN)

  • Существенное увеличение скорости сортировки

  • Существенное увеличение производительности на многопроцессорных машинах

Предыдущие пункты более подробно описаны в следующих разделах.

E.80.2. Миграция на версию 9.5

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

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

  • Изменение приоритета операторов в соответствии со стандартом SQL (Том Лейн)

    Приоритет операторов <=, >= и <> был понижен до приоритета операторов <, > и =. Приоритет проверок IS (например, x IS NULL) был понижен и стал непосредственно ниже приоритета этих шести операторов сравнения. Также операторы из нескольких слов, начинающиеся с NOT, теперь имеют приоритет своего базового оператора (например, NOT BETWEEN теперь имеет тот же приоритет, что и BETWEEN), тогда как раньше их приоритет был несогласованным; они воспринимались как NOT по отношению к левому операнду, но при этом как базовый оператор по отношению к правому. Новый параметр конфигурации operator_precedence_warning даёт возможность получать предупреждения о запросах, в которых эти изменения приоритета приводят к другому результату разбора запроса.

  • Смена в pg_ctl выбираемого по умолчанию режима отключения с smart на fast (Брюс Момджян)

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

  • Использование приведения присваивания для преобразований типов данных в присваиваниях PL/pgSQL, вместо перевода в текстовый вид и обратно (Том Лейн)

    Вследствие этого изменения при преобразовании булевых значений в строковые получаются значения true и false, а не t и f. Другие преобразования типов могут быть успешны в большем числе случаев, чем раньше; например, при присвоении числового значения 3.9 целочисленной переменной, ей будет присвоено 4, а не произойдёт ошибка, как раньше. Если для некоторых исходного и целевого типов приведение присваивания не определено, PL/pgSQL вернётся к старому поведению с преобразованием через вывод/ввод.

  • Возможность использования экранирования обратной косой чертой символов в параметрах командной строки сервера (Андрес Фройнд)

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

  • Изменение значения по умолчанию параметра GSSAPI include_realm на 1, чтобы по умолчанию имя области клиента не удалялось из имени принципала GSS или SSPI (Стивен Фрост)

  • Замена параметра конфигурации checkpoint_segments параметрами min_wal_size и max_wal_size (Хейкки Линнакангас)

    Если вы ранее настраивали checkpoint_segments, следующая формула даст вам приблизительно эквивалентное значение:

    max_wal_size = (3 * checkpoint_segments) * 16MB

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

  • Регулирование снятия процессов при нехватке памяти в Linux через новые переменные окружения PG_OOM_ADJUST_FILE и PG_OOM_ADJUST_VALUE, вместо параметров времени компиляции LINUX_OOM_SCORE_ADJ и LINUX_OOM_ADJ (Гуржит Сингх)

  • Списание параметра конфигурации сервера ssl_renegotiation_limit, который стал устаревшим в предыдущих выпусках (Андрес Фройнд)

    Хотя возможность повторного согласования SSL — хорошая вещь в теории, с ней связано достаточно ошибок, чтобы считать её скорее отрицательной на практике, и поэтому она будет исключена в будущих версиях соответствующих стандартов. Учитывая это, мы убрали поддержку этой возможности из PostgreSQL. Параметр ssl_renegotiation_limit сохранился, но ему нельзя присвоить ничего, кроме нуля (то есть он всегда отключён). Также он больше не описывается в документации.

  • Удаление параметра конфигурации сервера autocommit, который уже был устаревшим и не работал (Том Лейн)

  • Удаление из каталога pg_authid поля rolcatupdate, так как оно было бесполезным (Адам Брайтвелл)

  • В системном представлении pg_stat_replication в поле sent теперь NULL, а не 0, представляет недействительное значение (Магнус Хагандер)

  • Операторы извлечения элементов массивов json и jsonb теперь могут принимать отрицательные позиции, которые отсчитываются от конца массивов JSON (Питер Геохеган, Эндрю Дунстан)

    Ранее эти операторы возвращали NULL для отрицательных позиций.

E.80.3. Изменения

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

E.80.3.1. Сервер

E.80.3.1.1. Индексы
  • Добавление блочно-зональных индексов (BRIN) (Альваро Эррера)

    Индексы BRIN хранят только сводные данные (например, минимальные и максимальные значения) по зонам блоков в куче. Поэтому они очень компактны и легко обновляются; при этом, если данные кластеризованы натуральным образом, такие индексы позволяют очень существенно ускорить операции поиска.

  • Реализация возможности выполнять в запросах точную фильтрацию по дистанции для объектов (многоугольников, кругов), индексируемых по описанным прямоугольникам с использованием GiST (Александр Коротков, Хейкки Линнакангас)

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

  • Возможность использования индексов GiST в сканировании только по индексу (Анастасия Лубенникова, Хейкки Линнакангас, Андреас Карлссон)

  • Добавление параметра конфигурации gin_pending_list_limit, управляющего размером очередей GIN (Фудзии Масао)

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

  • Выдача при создании хеш-индексов предупреждения о том, что они не защищены от сбоев (Брюс Момджян)

E.80.3.1.2. Общая производительность
  • Ускорение сортировки полей varchar, text и numeric за счёт использования «сокращённых» ключей (Питер Геохеган, Эндрю Гирт, Роберт Хаас)

  • Расширение инфраструктуры, позволяющее производить сортировку, вызывая встроенные, не вызываемые из SQL функции сравнения, для выполнения команд CREATE INDEX, REINDEX и CLUSTER (Питер Геохеган)

  • Улучшение производительности соединений по хешу (Томаш Вондра, Роберт Хаас)

  • Улучшение параллелизма операции замены разделяемого буфера (Роберт Хаас, Амит Капила, Андрес Фройнд)

  • Уменьшение количества блокировок и закреплений страниц при сканировании индексов (Кевин Гриттнер)

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

  • Оптимизация использования памяти при отслеживании закреплений буферов в серверных процессах (Андрес Фройнд)

  • Улучшение масштабируемости блокировок (Андрес Фройнд)

    В особенности это снимает проблемы масштабируемости в системах с несколькими раздельными процессорами.

  • Оптимизатор теперь может удалить ненужные ссылки на соединяемые слева подзапросы (Дэвид Роули)

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

  • Возможность вынесения вызова негерметичной функции за представление с барьером безопасности, если функция не получает никакие выходные столбцы представления (Дин Рашид)

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

  • ANALYZE теперь вычисляет основную статистику (процент значений NULL и среднюю ширину столбцов) даже для столбцов, тип данных которых лишён функции равенства (Олександр Шульгин)

  • Ускорение расчёта CRC (циклического избыточного кода) и переход к CRC-32C (Абхиджит Менон-Сен, Хейкки Линнакангас)

  • Улучшение производительности сканирования индексов по битовой карте (Фёдор Сигаев, Том Лейн)

  • Ускорение команды CREATE INDEX за счёт исключения лишнего копирования в памяти (Роберт Хаас)

  • Увеличение числа разделов отображений буферов (Амит Капила, Андрес Фройнд, Роберт Хаас)

    Это увеличивает производительность при многопоточной нагрузке.

E.80.3.1.3. Наблюдение
  • Добавление параметра хранения log_autovacuum_min_duration для управления протоколированием автоочистки на уровне таблиц (Микаэль Пакье)

  • Добавление нового параметра конфигурации cluster_name (Томас Мунро)

    Эта строка, обычно задаваемая в postgresql.conf, позволяет клиентам идентифицировать кластер. Это имя также выводится в заголовке всех серверных процессов, что упрощает выделение всех процессов, принадлежащих одному кластеру.

  • Недопущение изменения log_disconnections простыми пользователями при установлении соединения (Фудзии Масао)

E.80.3.1.4. SSL
  • Проверка «Альтернативных имён субъекта» (Subject Alternative Names) (при наличии) в SSL-сертификатах серверов (Алексей Клюкин)

    Когда такое поле присутствует, оно проверяется вместо поля «Общее имя» (Common Name) в сертификате.

  • Добавление системного представления pg_stat_ssl, выдающего информацию о SSL-подключениях (Магнус Хагандер)

  • Добавление в libpq функций, возвращающих информацию об SSL независящим от реализации способом (Хейкки Линнакангас)

    Хотя PQgetssl() по-прежнему можно применять для обращений к функциям OpenSSL, теперь это считается устаревшим вариантом, так как будущие версии libpq могут поддерживать и другие реализации SSL. По возможности используйте новые функции PQsslAttribute(), PQsslAttributeNames() и PQsslInUse(), чтобы получать информацию об SSL независящим от реализации SSL способом.

  • В libpq должны сохраняться установленные многопоточные обработчики вызовов OpenSSL (Ян Урбански)

    Ранее они перезаписывались.

E.80.3.1.5. Параметры сервера
  • Замена параметра конфигурации checkpoint_segments параметрами min_wal_size и max_wal_size (Хейкки Линнакангас)

    Это изменение позволяет разместить большое количество файлов WAL, но при этом не сохранять их, когда они будут уже не нужны. Как следствие, значение max_wal_size по умолчанию увеличено до 1GB, что намного больше старой величины по умолчанию, устанавливаемой параметром checkpoint_segments. Также заметьте, что резервные серверы теперь производят точки перезапуска, стараясь ограничить использование пространства WAL значением max_wal_size; ранее они не учитывали параметр checkpoint_segments.

  • Регулирование снятия процессов при нехватке памяти в Linux через новые переменные окружения PG_OOM_ADJUST_FILE и PG_OOM_ADJUST_VALUE (Гуржит Сингх)

    Предыдущая инфраструктура управления механизмом OOM зависела от параметров времени компиляции LINUX_OOM_SCORE_ADJ и LINUX_OOM_ADJ, которые теперь не поддерживаются. Новое поведение распространяется на все сборки.

  • Осуществление записи времени фиксации транзакции, когда включён параметр track_commit_timestamp (Альваро Эррера, Петр Желинек)

    Прочитать записанное время можно, воспользовавшись функциями pg_xact_commit_timestamp() и pg_last_committed_xact().

  • Возможность устанавливать local_preload_libraries в команде ALTER ROLE SET (Питер Эйзентраут, Кётаро Хоригути)

  • Рабочие процессы автоочистки теперь реагируют на изменения параметров конфигурации в процессе работы (Микаэль Пакье)

  • Параметр конфигурации debug_assertions стал доступен только для чтения (Андрес Фройнд)

    Это значит, что утверждения теперь нельзя выключить, если они были включены на этапе компиляции, что позволяет дополнительно оптимизировать код. При этом изменении также был удалён ключ postgres -A.

  • Возможность установления параметра effective_io_concurrency в системах, где он не играет роли (Питер Эйзентраут)

  • Добавление системного представления pg_file_settings, показывающего содержимое файлов конфигурации сервера (Савада Масахико)

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

  • Возможность сбросить значения ALTER SYSTEM командой ALTER SYSTEM RESET (Вик Фиринг)

    Эта команда удаляет заданный параметр из postgresql.auto.conf.

E.80.3.2. Репликация и восстановление

  • Создание механизмов для отслеживания прогресса репликации, включая средства идентификации источника отдельных изменений при логической репликации (Андрес Фройнд)

    Эти механизмы полезны при создании решений репликации.

  • Переработка операции усечения мультитранзакций, чтобы она корректно фиксировалась в журнале (Андрес Фройнд)

    В результате этот механизм становится проще и надёжнее.

  • Добавление в recovery.conf параметра recovery_target_action, управляющего действиями после восстановления (Петр Желинек)

    Этот параметр пришёл на замену pause_at_recovery_target.

  • Добавление для archive_mode нового значения always, позволяющего архивировать получаемые файлы WAL (Фудзии Масао)

  • Добавление параметра конфигурации wal_retrieve_retry_interval для управления повторными попытками чтения WAL после сбоя (Алексей Васильев, Микаэль Пакье)

    Это особенно полезно для тёплого резерва.

  • Возможность сжатия образов полных страниц в WAL (Рахила Сьед, Микаэль Пакье)

    Это позволяет сократить объём WAL, за счёт дополнительной нагрузки на процессор при записи и воспроизведении WAL. Эта возможность управляется новым параметром конфигурации wal_compression (по умолчанию он отключён).

  • Архивация файлов WAL с расширением .partial при повышении резервного сервера (Хейкки Линнакангас)

  • Добавление параметра конфигурации log_replication_commands для протоколирования команд репликации (Фудзии Масао)

    По умолчанию команды репликации, в частности IDENTIFY_SYSTEM, не записываются в протокол, даже когда log_statement имеет значение all.

  • Добавление в pg_replication_slots отображения процессов, занимающих слоты репликации (Крейг Рингер)

    Эта информация выводится в новом столбце active_pid.

  • Возможность использовать в задаваемом в recovery.conf параметре primary_conninfo идентификаторы соединений в формате URI, например, postgres:// (Александр Шульгин)

E.80.3.3. Запросы

  • Возможность превращать команды INSERT, вызывающие конфликты ограничений, в команды UPDATE, либо игнорировать их (Питер Геохеган, Хейкки Линнакангас, Андрес Фройнд)

    Для этого введён синтаксис INSERT ... ON CONFLICT DO NOTHING/UPDATE. Таким образом в Postgres реализована популярная команда UPSERT.

  • Добавление в GROUP BY аналитической функциональности: GROUPING SETS, CUBE и ROLLUP (Эндрю Гирт, Атри Шарма)

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

    Для этого применяется синтаксис UPDATE tab SET (col1, col2, ...) = (SELECT ...).

  • Добавление в SELECT указания SKIP LOCKED для пропуска заблокированных строк (Томас Мунро)

    При этом не выдаётся ошибка, как в случае с NOWAIT.

  • Добавление в SELECT указания TABLESAMPLE, что позволяет получать подмножество строк таблицы (Петр Желинек)

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

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

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

  • Добавление более подробной информации о порядке сортировки в вывод EXPLAIN (Мариус Тиммер, Лукас Крефт, Арне Шеффер)

    Эта информация включает свойства COLLATE, DESC, USING и NULLS FIRST/LAST.

  • Добавление в вывод VACUUM количества страниц, пропущенных из-за закреплений (Джим Нэсби)

  • Команда TRUNCATE теперь корректно обновляет счётчики кортежей в pg_stat (Александр Шульгин)

E.80.3.4.1. REINDEX
  • Добавление в REINDEX возможности переиндексировать всю схему с новым указанием SCHEMA (Савада Масахико)

  • Добавление в REINDEX указания VERBOSE (Савада Масахико)

  • Исключение из вывода REINDEX DATABASE и SCHEMA имён столбцов в случае отсутствия указания VERBOSE (Саймон Риггс)

  • Удаление устаревшего указания FORCE команды REINDEX (Фудзии Масао)

E.80.3.5. Манипуляции с объектами

  • Добавление механизма защиты на уровне строк (Крейг Рингер, КайГай Кохэй, Адам Брайтвелл, Дин Рашид, Стивен Фрост)

    Этот механизм позволяет на уровне строк определять, какие строки пользователи смогут добавлять, изменять и даже видеть в таблице. Для управления им введены новые команды CREATE/ALTER/DROP POLICY и ALTER TABLE ... ENABLE/DISABLE ROW SECURITY.

  • Возможность изменения режима журналирования таблицы в WAL с применением команды ALTER TABLE ... SET LOGGED / UNLOGGED (Фабрицио де Ройес Мелло)

  • Добавление предложения IF NOT EXISTS в CREATE TABLE AS, CREATE INDEX, CREATE SEQUENCE и CREATE MATERIALIZED VIEW (Фабрицио де Ройес Мелло)

  • Добавление поддержки IF EXISTS в ALTER TABLE ... RENAME CONSTRAINT (Брюс Момджян)

  • Возможность передать некоторым командам DDL вместо имени конкретного пользователя идентификаторы CURRENT_USER и SESSION_USER, обозначающие текущего пользователя и пользователя сеанса (Кётаро Хоригути, Альваро Эррера)

    Это поддерживают команды ALTER USER, ALTER GROUP, ALTER ROLE, GRANT и ALTER объект OWNER TO.

  • Поддержка комментариев в ограничениях домена (Альваро Эррера)

  • Снижение уровней блокировки для некоторых команд, управляющих триггерами и сторонними ключами (Саймон Риггс, Андреас Карлссон)

  • Разрешение использовать LOCK TABLE ... ROW EXCLUSIVE MODE тем, кто имеет право INSERT в целевой таблице (Стивен Фрост)

    Ранее для этой команды требовалось право UPDATE, DELETE или TRUNCATE.

  • Применение ограничений CHECK для таблицы и домена в алфавитном порядке имён (Том Лейн)

    Ранее порядок был недетерминированным.

  • Добавление в CREATE/ALTER DATABASE возможности управлять свойствами datistemplate и datallowconn (Вик Фиринг)

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

  • Добавление поддержки IMPORT FOREIGN SCHEMA (Ронан Данклау, Микаэль Пакье, Том Лейн)

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

  • Возможность определения ограничений CHECK для сторонних таблиц (Шигеру Ханада, Эцуро Фудзита)

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

  • Возможность включать сторонние таблицы в иерархии наследования (Шигеру Ханада, Эцуро Фудзита)

    Чтобы это работало естественным образом, в сторонних таблицах теперь допускаются ограничения-проверки, помечаемые как недействительные, и могут задаваться характеристики хранения и OID, хотя по сути это никак не влияет на стороннюю таблицу.

  • Обёртки сторонних данных и методы нестандартного сканирования обрели возможность выносить соединения наружу (КайГай Кохэй)

  • Для устанавливаемого событийного триггера ddl_command_end собираются сведения об активности DDL, которые могут быть ему полезны (Альваро Эррера)

    Эти сведения можно получить через возвращающую множество функцию pg_event_trigger_ddl_commands() или через структуры данных C, если результат этой функции недостаточно детализирован.

  • Возможность реагирования в событийных триггерах на перезапись таблицы, вызываемую операцией ALTER TABLE (Димитри Фонтейн)

  • Добавление поддержки событийных триггеров для команд COMMENT, SECURITY LABEL и GRANT/REVOKE уровня базы данных (Альваро Эррера)

  • Добавление столбцов в вывод pg_event_trigger_dropped_objects (Альваро Эррера)

    Это позволяет упростить обработку операций удаления.

E.80.3.6. Типы данных

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

    Это требуется стандартом SQL/XML.

  • Возможность ввода в macaddr значений в формате xxxx-xxxx-xxxx (Хервин Вестстрате)

  • Запрещение несоответствующего стандарту SQL синтаксиса interval с указанием одновременно полей и точности (Брюс Момджян)

    Пр стандарту такие значения этого типа должны записываться, например, как INTERVAL MINUTE TO SECOND(2). В PostgreSQL ранее допускалась запись INTERVAL(2) MINUTE TO SECOND, но теперь принимается только стандартный способ.

  • Добавление оценки избирательности для операторов inet/cidr и улучшение оценки для функций текстового поиска (Эмре Хасегели, Том Лейн)

  • Добавление типов данных regrole и regnamespace для упрощения ввода и улучшенного вывода OID ролей и пространств имён (Кётаро Хоригути)

E.80.3.6.1. JSON
  • Добавление для типа jsonb функций jsonb_set() и jsonb_pretty() (Дмитрий Долгов, Эндрю Дунстан, Петр Желинек)

  • Добавление функций, формирующих jsonb: to_jsonb(), jsonb_object(), jsonb_build_object(), jsonb_build_array(), jsonb_agg() и jsonb_object_agg() (Эндрю Дунстан)

    Аналогичные функции уже имелись для типа json.

  • Снижение требований для преобразований в/из json и jsonb (Том Лейн)

  • Возможность вычитать из документов jsonb значения типов integer, text и массивы text (Дмитрий Долгов, Эндрю Дунстан)

  • Добавление для типа jsonb оператора || (Дмитрий Долгов, Эндрю Дунстан)

  • Добавление функций json_strip_nulls() и jsonb_strip_nulls() для удаления значений null из документов JSON (Эндрю Дунстан)

E.80.3.7. Функции

  • Добавление generate_series() для значений numeric (Плато Малугин)

  • Возможность передавать массив на вход array_agg() и ARRAY() (Али Акбар, Том Лейн)

  • Добавление функций array_position() и array_positions(), возвращающих позиции значений в массиве (Павел Стехуле)

  • Добавление оператора дистанции от точки до многоугольника (point-polygon) <-> (Александр Коротков)

  • Возможность использовать в качестве спецсимволов в SIMILAR TO и SUBSTRING многобайтовых символов (Джефф Девис)

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

  • Добавление вариации width_bucket(), поддерживающей любой упорядочиваемый тип данных и группы неодинаковой ширины (Петр Желинек)

  • Добавление необязательного аргумента missing_ok в pg_read_file() и связанные функции (Микаэль Пакье, Хейкки Линнакангас)

  • Введение конструкции =>, позволяющей задать значения именованных параметров в вызовах функций (Павел Стехуле)

    Ранее присвоение значения записывалось только с конструкцией :=. Это потребовало запретить создание пользовательского оператора =>. При создании пользовательских операторов => до этого выдавались предупреждения (начиная с PostgreSQL 9.0).

  • Добавление POSIX-совместимого округления для платформ, где используются функции округления, предоставляемые PostgreSQL (Педро Химено Фортеа)

E.80.3.7.1. Системные информационные функции и представления
  • Добавление функции pg_get_object_address(), возвращающей набор OID, однозначно идентифицирующих объект, и функции pg_identify_object_as_address(), возвращающей информацию об объекте по этим OID (Альваро Эррера)

  • Ослабление ограничений безопасности при просмотре запросов в pg_stat_activity и вызове функций pg_cancel_backend() и pg_terminate_backend() (Стивен Фрост)

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

  • Добавление функции pg_stat_get_snapshot_timestamp(), выдающей время снимка статистики (Мэтт Келли)

    Это время показывает, когда в последний раз файл снимка записывался в файловую систему.

  • Добавление функции mxid_age(), вычисляющей возраст мультитранзакций (Брюс Момджян)

E.80.3.7.2. Агрегатные функции
  • Добавление агрегатных функций min()/max() для типов данных inet/cidr (Харибабу Комми)

  • Использование 128-битных целых, где они поддерживаются, для накопления значений в некоторых агрегатных функциях (Андреас Карлссон)

E.80.3.8. Языки программирования на стороне сервера

  • Улучшение поддержки составных типов в PL/Python (Эд Бен, Ронан Данклау)

    Это позволяет возвращать из функций на PL/Python массивы составных типов.

  • Уменьшение неточности при преобразовании значений с плавающей точкой в PL/Python (Марко Крин)

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

    Это изменение привносит команды CREATE/DROP TRANSFORM. Также с ним добавлены дополнительные трансформации типов hstore и ltree из/в типы языков PL/Perl и PL/Python.

E.80.3.8.1. Серверный язык PL/pgSQL
  • Улучшение производительности массивов PL/pgSQL (Том Лейн)

  • Добавление оператора ASSERT в PL/pgSQL (Павел Стехуле)

  • Допущение использования в качестве идентификаторов большего количества ключевых слов PL/pgSQL (Том Лейн)

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

  • Перемещение pg_archivecleanup, pg_test_fsync, pg_test_timing и pg_xlogdump из contrib в src/bin (Питер Эйзентраут)

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

  • Добавление программы pg_rewind, позволяющей восстановить синхронизированное состояние главного сервера после отработки отказа (Хейкки Линнакангас)

  • Возможность управления слотами физической репликации с помощью pg_receivexlog (Микаэль Пакье)

    Для этого введены новые параметры --create-slot и --drop-slot.

  • В pg_receivewal появилась возможность синхронно сбрасывать WAL на диск с нововведённым параметром --synchronous (Фуруя Осаму, Фудзии Масао)

    Без него файлы WAL сохраняются на диске только при закрытии.

  • В vacuumdb появилась возможность очистки в параллельном режиме с нововведённым параметром --jobs (Дилип Кумар)

  • Программа vacuumdb теперь не запрашивает один и тот же пароль многократно, когда устанавливает несколько подключений (Харибабу Комми, Микаэль Пакье)

  • Добавление ключа --verbose для reindexdb (Савада Масахико)

  • Использование в pg_basebackup файла отображений табличных пространств при выборе формата tar, что позволяет поддерживать символические ссылки и пути длиннее 100 символов в MS Windows (Амит Капила)

  • Добавление в pg_xlogdump ключа --stats для получения сводной статистики (Абхиджит Менон-Сен)

E.80.3.9.1. psql
  • Возможность получить вывод psql в формате AsciiDoc (Шимон Гуз)

  • Добавление режима errors в переменной ECHO, в котором psql выводит только команды с ошибками (Павел Стехуле)

    Этот режим также можно включить, передав psql ключ -b.

  • Разделение в psql параметров, управляющих стилем линий в Юникоде, на параметры для колонок, заголовка и границ (Павел Стехуле)

    Поддерживаются одинарные и двойные линии; вариант по умолчанию — single (одинарные).

  • Поддержка нового параметра %l в переменных окружения PROMPT в psql, позволяющего увидеть текущий номер строки в многострочном операторе (Савада Масахико)

  • Добавление в \pset параметра pager_min_lines, управляющего вызовом постраничника (Эндрю Дунстан)

  • Улучшение подсчёта строк в psql, по результатам которого принимается решения о вызове постраничника (Эндрю Дунстан)

  • Теперь psql не запускается, если не может записать в файл, заданный ключом --output или --log-file (Том Лейн, Даниэль Верите)

    Ранее psql по сути игнорировал этот ключ в таких случаях.

  • Добавление в psql дополнения табуляцией, когда устанавливается переменная search_path (Джефф Джейнс)

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

  • Улучшение в psql дополнения табуляцией для триггеров и правил (Андреас Карлссон)

  • Добавление для команды psql \? разделов справки variables и options (Павел Стехуле)

    Команда \? variables показывает справку по специальным переменным psql, а \? options — по параметрам командной строки. Команда \? commands выводит метакоманды, которые выводились раньше, и это остаётся вариантом по умолчанию. Эти разделы справки также можно получить, передав в командной строке аргумент --help=раздел.

  • В команде psql \db+ добавлен вывод размера табличного пространства (Фабрицио де Ройес Мелло)

  • В psql \dT+ добавлено отображение владельцев типов данных (Магнус Хагандер)

  • В psql \watch добавлен вывод информации \timing (Фудзии Масао)

    Отключение вывода запросов \watch при запуске с ключом --echo-hidden, так как обычно они не нужны.

  • Команды psql \sf и \ef должны учитывать переменную ECHO_HIDDEN (Эндрю Дунстан)

  • Улучшение в psql дополнения табуляцией для \set, \unset и имён :variable (Павел Стехуле)

  • Возможность дополнения табуляцией имён ролей в командах psql \c (Иэн Барвик)

E.80.3.9.2. pg_dump
  • Возможность использовать в pg_dump снимок данных, полученный в другом сеансе, с параметром --snapshot (Саймон Риггс, Микаэль Пакье)

    Этот снимок должен быть экспортирован функцией pg_export_snapshot() или при создании слота логической репликации. Это может применяться для совместного использования согласованного снимка несколькими процессами pg_dump.

  • Поддержка в архивном формате tar таблиц размером больше 8 ГБ (Том Лейн)

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

  • Включение в pg_dump вывода версий сервера и pg_dump во всех режимах (Цзин Ван)

    До этого информация о версии выводилась только в режиме --verbose.

  • Исключение давно забытого параметра -i/--ignore-version из pg_dump, pg_dumpall и pg_restore (Фудзии Масао)

E.80.3.9.3. pg_ctl
  • Поддержка нескольких параметров pg_ctl -o, так что их значения соединяются вместе (Брюс Момджян)

  • Возможность определения для pg_ctl источника событий, записываемых в журнал событий MS Windows (МауМау)

    Это влияет только на события pg_ctl, а не сервера — для него источник событий задаётся отдельно, в postgresql.conf.

  • Если в качестве принимающего адреса сервера задаётся всёохватывающее значение (0.0.0.0 в IPv4 или :: в IPv6), нужно подключаться через адрес локального замыкания, а не использовать заданный адрес буквально (Кондо Юта)

    Это исправление в первую очередь затрагивает Windows, так как на других платформах pg_ctl предпочитает использовать Unix-сокет.

E.80.3.9.4. pg_upgrade
  • Перемещение pg_upgrade из contrib в src/bin (Питер Эйзентраут)

    В связи с этим изменением, функциональность, ранее предоставляемая модулем pg_upgrade_support, была включена в ядро сервера.

  • Поддержка нескольких параметров pg_upgrade -o/-O, так что их значения соединяются вместе (Брюс Момджян)

  • Улучшение сравнений правил сортировки для баз данных в pg_upgrade (Хейкки Линнакангас)

  • Ликвидация поддержки обновления с версии 8.3 (Брюс Момджян)

E.80.3.9.5. pgbench
  • Перемещение pgbench из contrib в src/bin (Питер Эйзентраут)

  • Исправлено вычисление TPS «за исключением установленных соединений» (Тацуо Исии, Фабьен Коэльо)

    Накладные расходы на установление соединения подсчитывались неправильно, когда число потоков pgbench было меньше числа клиентских подключений. Хотя это определённо ошибка, мы не будем переносить её исправление в версии до 9.5, так как при этом значения TPS окажутся несравнимыми с предыдущими результатами.

  • Подсчёт транзакций, выполнявшихся дольше заданного времени (Фабьен Коэльо)

    Этим подсчётом управляет нововведённый параметр --latency-limit.

  • Возможность получить в pgbench случайное распределение Гаусса или экспоненциальное распределение \setrandom (Мицумаса Кондо, Фабьен Коэльо)

  • Реализация в команде pgbench \set обработки арифметических выражений с несколькими операторами и включение % (деления по модулю) в список поддерживаемых операторов (Роберт Хаас, Фабьен Коэльо)

E.80.3.10. Исходный код

  • Упрощение формата записи WAL (Хейкки Линнакангас)

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

  • Улучшение представления записей фиксации и прерывания транзакций в WAL (Андрес Фройнд)

  • Добавление API атомарных операций с памятью (Андрес Фройнд)

  • Возможность реализации нестандартных методов сканирования и путей (КайГай Кохэй, Том Лейн)

    Это даёт расширениям дополнительные рычаги управления оптимизатором и исполнителем.

  • Возможность устанавливать блокировки после фильтрации в обёртках сторонних данных (Эцуро Фудзита)

  • Сторонние таблицы теперь могут участвовать в запросах INSERT ... ON CONFLICT DO NOTHING (Питер Геохеган, Хейкки Линнакангас, Андрес Фройнд)

    Обёртки сторонних данных не нужно модифицировать, чтобы это поддерживалось. Однако команда INSERT ... ON CONFLICT DO UPDATE со сторонними таблицами не поддерживается.

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

  • Улучшение инфраструктуры параллельного выполнения (Роберт Хаас, Амит Капила, Ной Миш, Рушаб Латиа, Дживан Чок)

  • Ликвидация портов для Alpha (CPU) и Tru64 (ОС) (Андрес Фройнд)

  • Ликвидация реализации циклических блокировок (spinlock) на основе перестановки байт для ARMv5 и предыдущих процессоров (Роберт Хаас)

    Особенность слабого упорядочивания доступа к памяти в ARM v5 делает такую реализацию блокировки ненадёжной. Однако использование циклических блокировок всё же возможно с новыми версиями gcc, поддерживающими атомарные операции.

  • Выдача ошибки при попытке записать в файлы tar чрезмерно длинный (больше 100 символов) путь (Питер Эйзентраут)

    Tar не поддерживает такие длинные пути.

  • Смена индексируемого класса операторов для столбцов pg_seclabel.provider и pg_shseclabel.provider на text_pattern_ops (Том Лейн)

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

  • Изменение примитивов spinlock, чтобы они действовали как барьеры для оптимизаций компилятора (Роберт Хаас)

E.80.3.10.1. MS Windows
  • Получение системного времени с большей точностью в Windows 8, Windows Server 2012 и более новых системах Windows (Крейг Рингер)

  • Установка разделяемых библиотек в bin в MS Windows (Питер Эйзентраут, Микаэль Пакье)

  • Установка src/test/modules вместе с contrib в сборках с MSVC (Микаэль Пакье)

  • В сборке с MSVC теперь может учитываться задаваемый для configure параметр --with-extra-version (Микаэль Пакье)

  • Передача PGFILEDESC в сборки contrib с MSVC (Микаэль Пакье)

  • Добавление значков во все собираемые с MSVC двоичные файлы и информации о версии во все двоичные файлы, собираемые для MS Windows (Ной Миш)

    При сборке с MinGW такие значки уже добавлялись ранее.

  • Добавление поддержки необязательных аргументов во внутреннюю реализацию getopt_long() (Микаэль Пакье, Андрес Фройнд)

    Это используется при сборке с MSVC.

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

  • Добавление статистики для получения минимального, максимального, среднего времени и стандартного отклонения в pg_stat_statements (Мицумаса Кондо, Эндрю Дунстан)

  • Добавление в pgcrypto функции pgp_armor_headers() для извлечения заголовков PGP Armor (Марко Тииккая, Хейкки Линнакангас)

  • Возможность задавать пустые строки замены в unaccent (Мохаммед Альхашаш)

    Это полезно для языков, в которых диакритические знаки представляются как отдельные символы.

  • Возможность задавать многосимвольные исходные строки в unaccent (Том Лейн)

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

  • Добавление в contrib модулей tsm_system_rows и tsm_system_time, реализующих дополнительные методы извлечения выборки (Петр Желинек)

  • Добавление функций исследования индекса GIN в pageinspect (Хейкки Линнакангас, Питер Геохеган, Микаэль Пакье)

  • Добавление информации о закреплении буфера в вывод pg_buffercache (Андрес Фройнд)

  • Возможность получать от pgstattuple приблизительных ответов с меньшими издержками, используя pgstattuple_approx() (Абхиджит Менон-Сен)

  • Перемещение dummy_seclabel, test_shm_mq, test_parser и worker_spi из contrib в src/test/modules (Альваро Эррера)

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