E.54. Выпуск 9.5
Дата выпуска: 2016-01-07
E.54.1. Обзор
В число ключевых усовершенствований PostgreSQL 9.5 входят:
- Возможность превращать команды - INSERT, вызывающие конфликты ограничений, в команды- UPDATE, либо игнорировать их
- Добавление в - GROUP BYаналитической функциональности:- GROUPING SETS,- CUBEи- ROLLUP
- Добавление механизма защиты на уровне строк 
- Создание механизмов для отслеживания прогресса репликации, включая средства идентификации источника отдельных изменений при логической репликации 
- Добавление блочно-зональных индексов (BRIN) 
- Существенное увеличение скорости сортировки 
- Существенное увеличение производительности на многопроцессорных машинах 
Предыдущие пункты более подробно описаны в следующих разделах.
E.54.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.54.3. Изменения
Ниже вы найдёте подробный список изменений, произошедших между предыдущим основным выпуском и выпуском PostgreSQL 9.5.
E.54.3.1. Сервер
E.54.3.1.1. Индексы
- Добавление блочно-зональных индексов (BRIN) (Альваро Эррера) - Индексы BRIN хранят только сводные данные (например, минимальные и максимальные значения) по зонам блоков в куче. Поэтому они очень компактны и легко обновляются; при этом, если данные кластеризованы натуральным образом, такие индексы позволяют очень существенно ускорить операции поиска. 
- Реализация возможности выполнять в запросах точную фильтрацию по дистанции для объектов (многоугольников, кругов), индексируемых по описанным прямоугольникам с использованием GiST (Александр Коротков, Хейкки Линнакангас) - Ранее, для использования такого индекса требовалось применять подзапрос, выбирающий большое количество строк, упорядоченных по дистанции до окружающего прямоугольника, а затем дополнительно отфильтровывать результат, рассчитывая расстояние точнее. 
- Возможность использования индексов GiST в сканировании только по индексу (Анастасия Лубенникова, Хейкки Линнакангас, Андреас Карлссон) 
- Добавление параметра конфигурации gin_pending_list_limit, управляющего размером очередей GIN (Фудзии Масао) - Это значение можно также задать на уровне индекса как параметр хранения индекса. Ранее размер очереди зависел от параметра work_mem, что было неудобно, так как подходящие значения - work_memобычно оказывались слишком большими для данной цели.
- Выдача при создании хеш-индексов предупреждения о том, что они не защищены от сбоев (Брюс Момджян) 
E.54.3.1.2. Общая производительность
- Ускорение сортировки полей - varchar,- textи- numericза счёт использования «сокращённых» ключей (Питер Геохеган, Эндрю Гирт, Роберт Хаас)
- Расширение инфраструктуры, позволяющее производить сортировку, вызывая встроенные, не вызываемые из SQL функции сравнения, для выполнения команд - CREATE INDEX,- REINDEXи- CLUSTER(Питер Геохеган)
- Улучшение производительности соединений по хешу (Томаш Вондра, Роберт Хаас) 
- Улучшение параллелизма операции замены разделяемого буфера (Роберт Хаас, Амит Капила, Андрес Фройнд) 
- Уменьшение количества блокировок и закреплений страниц при сканировании индексов (Кевин Гриттнер) - Прежде всего это полезно тем, что позволяет реже блокировать процедуру очистки индексов. 
- Оптимизация использования памяти при отслеживании закреплений буферов в серверных процессах (Андрес Фройнд) 
- Улучшение масштабируемости блокировок (Андрес Фройнд) - В особенности это снимает проблемы масштабируемости в системах с несколькими раздельными процессорами. 
- Оптимизатор теперь может удалить ненужные ссылки на соединяемые слева подзапросы (Дэвид Роули) 
- Возможность вынесения ограничений запроса в подзапросы с оконными функциями, где это уместно (Дэвид Роули) 
- Возможность вынесения вызова негерметичной функции за представление с барьером безопасности, если функция не получает никакие выходные столбцы представления (Дин Рашид) 
- Доработка планировщика, чтобы он использовал статистику, полученную из индекса по выражению с булевской функцией, когда соответствующий вызов функции присутствует в - WHERE(Том Лейн)
- ANALYZEтеперь вычисляет основную статистику (процент значений NULL и среднюю ширину столбцов) даже для столбцов, тип данных которых лишён функции равенства (Олександр Шульгин)
- Ускорение расчёта CRC (циклического избыточного кода) и переход к CRC-32C (Абхиджит Менон-Сен, Хейкки Линнакангас) 
- Улучшение производительности сканирования индексов по битовой карте (Фёдор Сигаев, Том Лейн) 
- Ускорение команды - CREATE INDEXза счёт исключения лишнего копирования в памяти (Роберт Хаас)
- Увеличение числа разделов отображений буферов (Амит Капила, Андрес Фройнд, Роберт Хаас) - Это увеличивает производительность при многопоточной нагрузке. 
E.54.3.1.3. Наблюдение
- Добавление параметра хранения - log_autovacuum_min_durationдля управления протоколированием автоочистки на уровне таблиц (Мишель Пакье)
- Добавление нового параметра конфигурации cluster_name (Томас Мунро) - Эта строка, обычно задаваемая в - postgresql.conf, позволяет клиентам идентифицировать кластер. Это имя также выводится в заголовке всех серверных процессов, что упрощает выделение всех процессов, принадлежащих одному кластеру.
- Недопущение изменения log_disconnections простыми пользователями при установлении соединения (Фудзии Масао) 
E.54.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.54.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.54.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.54.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.54.3.4. Служебные команды
- Добавление более подробной информации о порядке сортировки в вывод - EXPLAIN(Мариус Тиммер, Лукас Крефт, Арне Шеффер)- Эта информация включает свойства - COLLATE,- DESC,- USINGи- NULLS FIRST- /LAST.
- Добавление в вывод - VACUUMколичества страниц, пропущенных из-за закреплений (Джим Нэсби)
- Команда - TRUNCATEтеперь корректно обновляет счётчики кортежей в- pg_stat(Александр Шульгин)
E.54.3.4.1. REINDEX
- Добавление в - REINDEXвозможности переиндексировать всю схему с новым указанием- SCHEMA(Савада Масахико)
- Добавление в - REINDEXуказания- VERBOSE(Савада Масахико)
- Исключение из вывода - REINDEX DATABASEи- SCHEMAимён столбцов в случае отсутствия указания- VERBOSE(Саймон Риггс)
- Удаление устаревшего указания - FORCEкоманды- REINDEX(Фудзии Масао)
E.54.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.
E.54.3.5.1. Сторонние таблицы
- Добавление поддержки IMPORT FOREIGN SCHEMA (Ронан Данклау, Мишель Пакье, Том Лейн) - Эта команда позволяет автоматически создать локальные сторонние таблицы с той же структурой, что имеют таблицы на удалённом сервере. 
- Возможность определения ограничений - CHECKдля сторонних таблиц (Шигеру Ханада, Эцуро Фудзита)- Такие ограничения считаются контролируемыми на удалённом сервере, а не локально. Однако для оптимизации запросов предполагается, что они удовлетворяются, как например при исключении по ограничению. 
- Возможность включать сторонние таблицы в иерархии наследования (Шигеру Ханада, Эцуро Фудзита) - Чтобы это работало естественным образом, в сторонних таблицах теперь допускаются ограничения-проверки, помечаемые как недействительные, и могут задаваться характеристики хранения и - OID, хотя по сути это никак не влияет на стороннюю таблицу.
- Обёртки сторонних данных и методы нестандартного сканирования обрели возможность выносить соединения наружу (КайГай Кохэй) 
E.54.3.5.2. Событийные триггеры
- Для устанавливаемого событийного триггера - ddl_command_endсобираются сведения об активности DDL, которые могут быть ему полезны (Альваро Эррера)- Эти сведения можно получить через возвращающую множество функцию - pg_event_trigger_ddl_commands()или через структуры данных C, если результат этой функции недостаточно детализирован.
- Возможность реагирования в событийных триггерах на перезапись таблицы, вызываемую операцией - ALTER TABLE(Димитри Фонтейн)
- Добавление поддержки событийных триггеров для команд - COMMENT,- SECURITY LABELи- GRANT/- REVOKEуровня базы данных (Альваро Эррера)
- Добавление столбцов в вывод - pg_event_trigger_dropped_objects(Альваро Эррера)- Это позволяет упростить обработку операций удаления. 
E.54.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.54.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.54.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.54.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.54.3.8. Языки программирования на стороне сервера
- Улучшение поддержки составных типов в PL/Python (Эд Бен, Ронан Данклау) - Это позволяет возвращать из функций на PL/Python массивы составных типов. 
- Уменьшение неточности при преобразовании значений с плавающей точкой в PL/Python (Марко Крин) 
- Возможность определения функций преобразования между типами данных SQL и типами данных процедурных языков (Питер Эйзентраут) - Это изменение привносит команды - CREATE/- DROP TRANSFORM. Также с ним добавлены дополнительные трансформации типов hstore и ltree из/в типы языков PL/Perl и PL/Python.
E.54.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.54.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 дополнения табуляцией для триггеров и правил (Андреас Карлссон) 
E.54.3.9.1.1. Команды с обратной косой чертой
- Добавление для команды 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.54.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.54.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.54.3.9.4. pg_upgrade
- Перемещение pg_upgrade из - contribв- src/bin(Питер Эйзентраут)- В связи с этим изменением, функциональность, ранее предоставляемая модулем pg_upgrade_support, была включена в ядро сервера. 
- Поддержка нескольких параметров pg_upgrade - -o/- -O, так что их значения соединяются вместе (Брюс Момджян)
- Улучшение сравнений правил сортировки для баз данных в pg_upgrade (Хейкки Линнакангас) 
- Ликвидация поддержки обновления с версии 8.3 (Брюс Момджян) 
E.54.3.9.5. pgbench
- Перемещение pgbench из - contribв- src/bin(Питер Эйзентраут)
- Исправлено вычисление TPS «за исключением установленных соединений» (Тацуо Исии, Фабьен Коэльо) - Накладные расходы на установление соединения подсчитывались неправильно, когда число потоков pgbench было меньше числа клиентских подключений. Хотя это определённо ошибка, мы не будем переносить её исправление в версии до 9.5, так как при этом значения TPS окажутся несравнимыми с предыдущими результатами. 
- Подсчёт транзакций, выполнявшихся дольше заданного времени (Фабьен Коэльо) - Этим подсчётом управляет нововведённый параметр - --latency-limit.
- Возможность получить в pgbench случайное распределение Гаусса или экспоненциальное распределение - \setrandom(Мицумаса Кондо, Фабьен Коэльо)
- Реализация в команде pgbench - \setобработки арифметических выражений с несколькими операторами и включение- %(деления по модулю) в список поддерживаемых операторов (Роберт Хаас, Фабьен Коэльо)
E.54.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.54.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.54.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. 
