E.57. Выпуск 9.6
Дата выпуска: 2016-09-29
E.57.1. Обзор
В число ключевых усовершенствований PostgreSQL 9.6 входят:
Параллельное выполнение последовательного сканирования, соединений и агрегатных вычислений
Предупреждение излишнего сканирования страниц при операциях очистки с заморозкой
При синхронной репликации стало возможным использовать несколько резервных серверов для увеличения надёжности
Полнотекстовый поиск теперь позволяет находить фразы (несколько соседних слов)
postgres_fdwтеперь может выполнять на удалённой стороне соединение, сортировку,UPDATEиDELETEСущественное увеличение производительности, особенно в части масштабируемости на многопроцессорных серверах
Предыдущие пункты более подробно описаны в следующих разделах.
E.57.2. Миграция на версию 9.6
Тем, кто хочет мигрировать данные из любой предыдущей версии, необходимо выполнить выгрузку/загрузку данных с помощью pg_dumpall или воспользоваться pg_upgrade.
В версии 9.6 реализован ряд изменений, которые могут повлиять на совместимость с предыдущими выпусками. Рассмотрите следующие несовместимые аспекты:
Добавление в
pg_stat_activityинформации о том, чего ждёт процесс (Амит Капила, Ильдус Курбангалиев)Исторически процесс показывался как ожидающий, только если он ожидал тяжёлой блокировки. Теперь в
pg_stat_activityтакже показываются ожидания лёгких блокировок и закреплений буферов. Также теперь виден тип ожидаемой блокировки. В результате этих изменений столбецwaitingбыл заменён столбцамиwait_event_typeиwait_event.В функции
to_char()знак минус не должен считаться частью поля с заданной шириной для компонентов времени (Брюс Момджян)Например,
to_char('-4 years'::interval, 'YY')теперь возвращает-04, а не-4.Более разумное поведение функции
extract()с бесконечными значениями в аргументах (Виталий Буровой)Ранее функция
extract()просто возвращала ноль для аргумента «бесконечность», вне зависимости от выбранного поля. Теперь она будет возвращатьinfinityили-infinityсоответственно, когда это поле является монотонно возрастающим (например,year,epoch), иNULLв противном случае (например,day,hour). Также теперь выдаётся ожидаемая ошибка при некорректном указании поля.Ликвидация «особенности» PL/pgSQL, подавляющей строку
КОНТЕКСТв сообщениях, выдаваемых командамиRAISE(Павел Стехуле)Этот древний трюк для обратной совместимости по общему мнению пережил то время, когда он был полезен.
Исправление стандартного анализатора текстового поиска, чтобы он принимал начальные цифры во фрагментах текста типа
emailиhost(Артур Закиров)В большинстве случаев это не должно отразиться на разборе текста, но если вы часто имеете дело с такими адресами, может иметь смысл перестроить зависимые столбцы и индексы
tsvector, чтобы адреса этих видов корректно находились при поиске.Расширение стандартного файла
unaccent.rulesв модулеcontrib/unaccentдля обработки всех существующих в Unicode диакритик и корректного разворачивания лигатур (Томас Манро, Леонард Бенедетти)Предыдущая версия не считала нужным преобразовывать некоторые редкие буквы с диакритическими знаками. Кроме того, лигатуры теперь разворачиваются в отдельные буквы. В инсталляциях, где используется этот файл правил, может иметь смысл перестроить столбцы
tsvectorи зависимые индексы.Ликвидация давно считавшихся устаревшими указаний
CREATEUSER/NOCREATEUSERкомандыCREATE ROLEи родственных ей (Том Лейн)Указание
CREATEUSERна самом деле означалоSUPERUSERиз давних соображений относительно обратной совместимости. Это постоянно вводило в заблуждение людей, которые полагали (и имели на это право), что оно означалоCREATEROLE. Это указание считается устаревшим уже десять лет, так что пора решить эту проблему, убрав его.Считать имена ролей, начинающиеся с
pg_, зарезервированными (Стивен Фрост)Теперь пользователям будет запрещено создавать роли с такими именами. Это предотвращает конфликты со встроенными ролями, создаваемыми программой initdb.
Смена имени столбца в представлении
information_schema.routinesсresult_cast_character_set_nameнаresult_cast_char_set_name(Клеман Прево)Стандарт SQL:2011 устанавливает более длинное имя, но это, скорее всего, ошибка, так как у соседних столбцов имена более краткие, как и в других представлениях
information_schema.Параметр psql
-cтеперь не подразумевает поведение параметра--no-psqlrc(Павел Стехуле, Каталин Якоб)Для получения старого поведения нужно явно написать
--no-psqlrc(или сокращение-X). Модифицированные таким образом скрипты будут продолжать работать и со старыми версиями psql.Усовершенствование функции параметра pg_restore
-t, чтобы он отбирал все типы отношений, а не только простые таблицы (Крейг Рингер)Изменение формата отображения
NextXIDв pg_controldata и связанных местах (Джо Конвей, Брюс Момджян)Отображение значений эпоха-и-ID-транзакции в формате
число:число. Предыдущий форматчисло/числобыл похож на формат LSN, что могло вводить в заблуждение.Функции расширений, для которых это уместно, помечены как безопасные для распараллеливания (Андреас Карлссон)
Во многие стандартные расширения внесены изменения, чтобы их функции могли выполняться параллельными исполнителями запросов. Эти изменения не вступят в силу в базах данных, обновлённых с предыдущих версий (с помощью pg_upgrade), пока вы не примените для каждого такого расширения команду
ALTER EXTENSION UPDATE(в каждой базе данных кластера).
E.57.3. Изменения
Ниже вы найдёте подробный список изменений, произошедших между предыдущим основным выпуском и выпуском PostgreSQL 9.6.
E.57.3.1. Сервер
E.57.3.1.1. Параллельное выполнение запросов
Параллельные запросы (Роберт Хаас, Амит Капила, Дэвид Роули и многие другие)
С версией 9.6 в PostgreSQL появляется начальная поддержка параллельного выполнения больших запросов. Параллельному выполнению подлежат строго запросы только на чтение, в которых производится последовательное сканирование целевой таблицы. В параллельном режиме могут выполняться и соединения по хешу с вложенными циклами, а также агрегирование (с поддерживаемыми агрегатными функциями). Ещё многое предстоит сделать, но и этот набор возможностей уже весьма полезен.
Параллельное выполнение запросов по умолчанию отключено (пока). Чтобы выключить его, установите для нового конфигурационного параметра max_parallel_workers_per_gather значение, большее нуля. Для дополнительной настройки распараллеливания запросов также введены новые параметры force_parallel_mode, parallel_setup_cost, parallel_tuple_cost и min_parallel_relation_size.
Инфраструктура для обозначения параллельно-безопасности функций (Роберт Хаас, Амит Капила)
E.57.3.1.2. Индексы
Индексы GIN строятся более эффективно при значениях maintenance_work_mem, превышающих 1 ГБ (Роберт Абрахам, Фёдор Сигаев)
Включение страниц, удаляемых из очереди обработки индекса GIN, сразу в карту свободного пространства (Джефф Джейнс, Фёдор Сигаев)
Это предотвращает замусоривание базы, если таблица очищается нечасто.
Добавление функции
gin_clean_pending_list(), позволяющей вручную вызвать очистку очереди обработки индекса GIN (Джефф Джейнс)Ранее такая очистка производилась только в результате очистки или анализа родительской таблицы.
Оптимизация обработки «мёртвых» кортежей в индексах GiST (Анастасия Лубенникова)
Кортежи в индексе теперь помечаются как «мёртвые», если при сканировании индекса обнаруживается, что соответствующий кортеж в куче — «мёртвый». Впоследствии, при добавлении новых кортежей, кортежи, помеченные как «мёртвые», могут быть замещены, если потребуется место на этой странице.
Добавлен класс операторов SP-GiST для типа
box(Александр Лебедев)
E.57.3.1.3. Сортировка
Увеличение производительности сортировки за счёт использования quicksort вместо выбора с замещением при выполнении этапов внешней сортировки (Питер Гейган)
Новый подход позволяет эффективнее использовать кеш процессора при типичных размерах кеша и объёмах данных. Где необходимо, новое поведение можно скорректировать, воспользовавшись новым конфигурационным параметром replacement_sort_tuples.
Ускорение сортировки текста, когда одна и та же строка встречается многократно (Питер Гейган)
Ускорение сортировки типов
uuid,byteaиchar(n)за счёт использования «сокращённых» ключей (Питер Гейган)Поддержка сокращённых ключей была также добавлена в дополнительные классы операторов
text_pattern_ops,varchar_pattern_opsиbpchar_pattern_ops. Сокращённые ключи теперь могут задействоваться и при вычислении сортирующих агрегатных функций.Ускорение команды
CREATE INDEX CONCURRENTLYза счёт обработки идентификаторов TID как 64-битных целых в процессе сортировки (Питер Гейган)
E.57.3.1.4. Блокировки
Уменьшение конкуренции за
ProcArrayLock(Амит Капила, Роберт Хаас)Улучшение производительности за счёт переноса блокировок содержимого буфера в дескрипторы буферов (Андрес Фройнд, Саймон Риггс)
Замена циклических блокировок заголовков в общем буфере атомарными операциями для улучшения масштабируемости (Александр Коротков, Андрес Фройнд)
Использование атомарных операций вместо циклических блокировок для защиты очереди ожидания
LWLock(Андрес Фройнд)Разбиение на части списка свободных элементов для разделяемых по хешу таблиц, для уменьшения конкуренции на многопроцессорных серверах (Александр Алексеев)
Сокращение взаимоблокировок на резервных серверах при воспроизведении операций очистки индекса-B-дерева (Саймон Риггс)
Это изменение исключает существенные задержки при репликации, которые иногда имели место при воспроизведении таких операций.
E.57.3.1.5. Статистика оптимизатора
Улучшение оценок
ANALYZEдля столбцов с большим количеством NULL (Томаш Вондра, Александр Шульгин)Ранее процедура
ANALYZEбыла склонна недооценивать число различных и отличных отNULLзначений в столбце со множествомNULL, и также неточно вычисляла наиболее распространённые значения.Улучшение оценки планировщиком количества различных значений в результате запроса (Томаш Вондра)
Использование связей по внешним ключам для оценки избирательности предикатов соединения (Томаш Вондра, Дэвид Роули)
Если в таблице
tимеется ограничение внешнего ключа, например(a,b) REFERENCES r (x,y), то условиеWHEREвидаt.a = r.x AND t.b = r.yне может выбрать больше одной строки изrдля строкиt. Ранее планировщик считал объединённыеANDусловия независимыми и поэтому часто неправильно оценивал избирательность запроса. Теперь он сравнивает условияWHEREс применимыми ограничениями внешнего ключа и получает более точные оценки.
E.57.3.1.6. VACUUM
Предупреждение повторной очистки страниц, содержащих только замороженные кортежи (Масахико Савада, Роберт Хаас, Андрес Фройнд)
Ранее очистка для предотвращения зацикливания должна была просматривать все страницы таблицы, даже страницы, с которыми ничего не нужно делать. Теперь страницы, содержащие только замороженные кортежи, обозначаются в карте видимости таблицы, и могут быть пропущены при очистке, даже когда она производится в целях предотвращения зацикливания транзакций. Это должно значительно снизить стоимость обслуживания больших таблиц, содержащих в основном постоянные данные.
Если необходимо, при очистке можно принудительно включить обработку полностью замороженных страниц, передав нововведённый параметр
DISABLE_PAGE_SKIPPING. Это никогда не нужно делать в обычных условиях, но при повреждении карты видимости это может быть полезно.Предупреждение бесполезных попыток усечения кучи в процессе
VACUUM(Джефф Джейнс, Том Лейн)Это изменение предотвращает исключительную блокировку таблицы в некоторых случаях, когда усечение таблицы невозможно. Прежде всего это полезно тем, что позволяет лишний раз не отменять запросы на резервных серверах.
E.57.3.1.7. Общая производительность
Возможность аннулирования старых снимков MVCC после настраиваемого промежутка времени (Кевин Гриттнер)
Обычно удалённые кортежи не могут быть ликвидированы физически при очистке, пока не будет отработана последняя транзакция, в которой они могут быть видны. Транзакция, остающаяся открытой в течение долгого времени, таким образом может стать причиной значительного замусоривания таблицы, препятствуя освобождению места. Это средство позволяет задать с помощью нового конфигурационного параметра old_snapshot_threshold ограничение времени, в течение которого снимок MVCC будет гарантированно актуальным. По истечении этого времени мёртвые кортежи могут быть удалены. Транзакция, использующая просроченный снимок, получит ошибку, если она попытается прочитать страницу, которая могла бы содержать такие данные.
Игнорирование в
GROUP BYстолбцов, функционально зависящих от других (Дэвид Роули)Если в предложение
GROUP BYвключаются все столбцы неотложенного первичного ключа, а также другие столбцы той же таблицы, последние столбцы являются избыточными и могут быть исключены из группировки. Во многих распространённых случаях это упрощает вычисления.Возможность использования сканирования только индекса с частичным индексом, когда предложение
WHEREиндекса обращается к не индексированным столбцам (Томаш Вондра, Кётаро Хоригути)Например, индекс, определённый командой
CREATE INDEX tidx_partial ON t(b) WHERE a > 0, теперь может использоваться для сканирования только по индексу в запросе, в котором задаётся условиеWHERE a > 0и никак больше не задействуетсяa. Ранее это использование не допускалось, на основании того, чтоaне входит в число столбцов индекса.Выполнение записи в контрольных точках упорядоченным образом (Фабьен Коэльо, Андрес Фройнд)
Ранее, в контрольных точках грязные страницы записывались в том порядке, в каком они располагались в общих буферах, то есть практически в случайном. Это влекло снижение производительности, особенно на вращающихся носителях. В результате данного изменения запись в контрольных точках будет производиться по порядку файлов и номеров блоков, и будет сбалансирована по табличным пространствам.
Там, где возможно, вызывать функцию отложенной записи в ядре после некоторого количества операций записи, во избежание накопления «грязных» данных в дисковых буферах ядра (Фабьен Коэльо, Андрес Фройнд)
PostgreSQL записывает данные в дисковый кеш ядра, откуда они будут сброшены в физическое хранилище в нужное время. Многие операционные системы не очень эффективно управляют этим, позволяя накапливаться в памяти большим объёмам данным, которые затем приходится сбрасывать на диск одномоментно, что приводит к большим задержкам при очередных операциях ввода/вывода до завершения сброса. Это изменение внесено, чтобы снять эту проблему, явно запрашивая сброс данных через определённый настраиваемый интервал.
В Linux для этой цели применяется функция
sync_file_range(), и так как она практически безвредна, этот механизм задействуется в Linux по умолчанию. Возможность сброса буфера доступна и на других платформах, где имеется функцияmsync()илиposix_fadvise(), но эти функции дают некоторые нежелательные побочные эффекты, поэтому на всех платформах кроме Linux данный механизм по умолчанию отключён.Этим поведением управляют новые конфигурационные параметры backend_flush_after, bgwriter_flush_after, checkpoint_flush_after и wal_writer_flush_after.
Увеличение производительности агрегатных функций в результате разделения вычислений между несколькими агрегатами, если они имеют одинаковые аргументы и функции перехода (Дэвид Роули)
Например, в запросе
SELECT AVG(x), VARIANCE(x) FROM tabдля строки может быть достаточно одной операции для вычисления обоих агрегатов.Ускорение проверок видимости для недавно созданных кортежей путём проверки снимка текущей транзакции, вместо
pg_clog, для определения, должна ли исходная транзакция считаться зафиксированной (Джефф Джейнс, Том Лейн)Допущение установки вспомогательных битов кортежей на более раннем этапе (Андрес Фройнд)
Увеличение производительности подготовленных транзакций с коротким временем жизни (Стас Кельвич, Саймон Риггс, Паван Деоласи)
Информация о двухфазной фиксации теперь записывается только в WAL во время
PREPARE TRANSACTIONи считывается назад из WAL во времяCOMMIT PREPARED, если это имеет место вскоре. Отдельный файл состояния создаётся, только если ожидающая транзакция не фиксируется и не прерывается к моменту следующей контрольной точки.Увеличение скорости уничтожения контекста памяти (Ян Вик)
Увеличение производительности владельцев ресурсов с большим количеством отслеживаемых объектов (Александр Алексеев)
Увеличение скорости функций вывода типов
timestamp,timeиdate(Дэвид Роули, Андрес Фройнд)Недопущение некоторых излишних отмен запросов на серверах горячего резерва при воспроизведении действий, требующих блокировок
AccessExclusive(Джефф Джейнс)Расширение отношений на несколько блоков сразу при конкуренции за блокировку расширения отношения (Дилип Кумар)
Это улучшает масштабируемость и снижает уровень конфликтов.
Увеличение числа буферов clog для лучшей масштабируемости (Амит Капила, Андрес Фройнд)
Ускорение вычисления выражений в PL/pgSQL за счёт постоянного хранения в памяти записей
ParamListInfoдля простых переменных (Том Лейн)Недопущение уменьшения значения
SO_SNDBUFниже значения по умолчанию в последних версиях Windows (Чен Хуацзюнь)Отключение механизма update_process_title по умолчанию в Windows (Такаюки Цунакава)
В Windows издержки изменения заголовка процесса гораздо выше, чем на многих других платформах, и само это изменение менее полезно, так как большинство пользователей Windows не имеют утилит для наблюдения за заголовками процессов.
E.57.3.1.8. Наблюдение
Добавление системного представления
pg_stat_progress_vacuumдля наблюдения за процессом выполнения операцийVACUUM(Амит Ланготе, Роберт Хаас, Винаяк Покале, Рахила Сьед)Добавление функций
pg_control_system(),pg_control_checkpoint(),pg_control_recovery()иpg_control_init(), выдающих поляpg_controlв SQL (Джо Конвей, Микаэль Пакье)Добавление системного представления
pg_config(Джо Конвей)В этом представлении выводится та же информация, что выдаётся утилитой командной строки pg_config, а именно разнообразные конфигурационные параметры времени компиляции PostgreSQL.
Добавление столбца
confirmed_flush_lsnв системное представлениеpg_replication_slots(Марко Тииккая)Добавление системного представления
pg_stat_wal_receiverс информацией о состоянии процесса приёмника WAL на сервере горячего резерва (Микаэль Пакье)Добавление функции
pg_blocking_pids()для надёжного определения, какие сеансы блокируют какие (Том Лейн)Эта функция возвращает массив идентификаторов процессов всех сеансов, которые блокируют сеанс с заданным идентификатором. Ранее пользователи получали такую информацию, образуя замкнутое соединение с представлением
pg_locks. Однако сделать это сколь-нибудь корректно слишком сложно, а с внедрением параллельных запросов старый подход стал полностью непрактичным, так как блокировки могут удерживаться или запрашиваться дочерними рабочими процессами, а не главным обслуживающим процессом сеанса.Добавление функции
pg_current_xlog_flush_location()для вывода текущей позиции сброшенной записи в журнале транзакции (Томаш Вондра)Добавление функции
pg_notification_queue_usage(), показывающей, насколько заполнена очередьNOTIFY(Брендан Юрд)Ограничение подробностей при выводе статистики использования контекстов памяти (Том Лейн)
Информация об использовании памяти, выводимая в протокол главного сервера при нехватке памяти, теперь включает итоговую статистику при большом числе контекстов памяти, вместо одного объёмного отчёта. Также в неё теперь входит итоговая строка «Всего».
E.57.3.1.9. Аутентификация
Добавление метода аутентификации BSD, позволяющего использовать для проверки подлинности клиентов PostgreSQL системную службу аутентификации BSD (Мариса Эмерсон)
Аутентификация BSD в настоящее время поддерживается только в OpenBSD.
Когда используется аутентификация PAM, через поле
PAM_RHOSTмодулям PAM может выдаваться IP-адрес или имя компьютера клиента (Гжегож Сампольски)Добавление вывода в протокол сервера сообщений о дополнительных типах ошибок при проверке пароля (Том Лейн)
Теперь в случае любых ошибок, которые обычно могут возникать, в протокол должны выдаваться сообщения уровня
ПОДРОБНО.Поддержка паролей RADIUS длиной до 128 символов (Марко Тииккая)
Добавление новых параметров аутентификации SSPI
compat_realmиupn_username, позволяющих выбрать, как при проверке подлинности SSPI будут использоваться имена области и пользователя (NetBIOS или Kerberos) (Кристиан Ульрих)
E.57.3.1.10. Настройка сервера
Возможность автоматического завершения сеансов, которые находятся в состоянии простоя в транзакции слишком долго (Вик Фиринг)
Данное поведение настраивается новым конфигурационным параметром idle_in_transaction_session_timeout. Это помогает бороться с забытыми транзакциями, которые могут удерживать блокировки или мешать производить очистку в течение длительного времени.
Увеличение максимально допустимого значения checkpoint_timeout до 24 часов (Саймон Риггс)
Возможность устанавливать
effective_io_concurrencyдля табличного пространства; это полезно в случаях, когда различные табличные пространства имеют разные характеристики ввода/вывода (Жюльен Руо)Добавление в log_line_prefix спецкода
%nдля вывода текущего времени в формате Unix, с миллисекундами (Томаш Вондра, Джефф Дэвис)Добавление конфигурационных параметров syslog_sequence_numbers и syslog_split_messages для дополнительной манипуляции форматом сообщений при выводе их в syslog (Питер Эйзентраут)
Объединение значений
archiveиhot_standbyконфигурационного параметра wal_level в одном новом значенииreplica(Питер Эйзентраут)Различать эти варианты больше не имеет смысла, и их слияние является шагом вперёд к запланированному упрощению организации репликации. Старые варианты по-прежнему принимаются, но внутри преобразуются к
replica.Добавление в configure параметра
--with-systemd, позволяющего вызыватьsd_notify()при запуске и остановке сервера (Питер Эйзентраут)Это позволяет использовать единицы служб systemd типа
notify, что значительно упрощает управление PostgreSQL в окружении systemd.Теперь к файлу SSL-ключа сервера может быть разрешён доступ группы на чтение, если он принадлежит пользователю
root(Кристоф Берг)Ранее мы настаивали на том, чтобы файл ключа принадлежал пользователю, запускающему сервер PostgreSQL, но это оказалось неудобным в некоторых системах (например, в Debian), в которых организовано централизованное управление сертификатами. Поэтому стоит допустить случай, когда файл принадлежит
root, а группа имеет доступ на чтение. И в этом случае администратор отвечает за то, чтобы в эту группу не входили недоверенные пользователи.
E.57.3.1.11. Надёжность
Принудительное завершение обслуживающих процессов в случае отключения главного процесса (Раджив Растоги, Роберт Хаас)
При нормальных обстоятельствах главный процесс всегда должен жить дольше своих дочерних процессов. Если же он по какой-то причине умирает, процессы, обслуживающие клиентов, принудительно завершаются с ошибкой. Ранее работающие процессы продолжали выполняться до отключения клиента; но это было небезопасно и неэффективно. Это также не давало запустить новый управляющий процесс до завершения последнего из старых обслуживающих процессов. Теперь обслуживающие процессы будут проверять, жив ли главный процесс, ожидая ввода/вывода от клиента, так что они завершатся не мгновенно, но это должно произойти не позже завершения текущего запроса.
Проверка конфликтов сериализуемости перед тем, как будет выдана ошибка нарушения ограничений (Томас Манро)
В транзакциях сериализуемого уровня изоляции желательно, чтобы ошибка, вызванная параллельными транзакциями, заявлялась как ошибка сериализации, что скажет приложению, что попытка повторить то же действие может быть успешной. К сожалению, это не будет надёжно работать при дублировании ключа при параллельном его добавлении. В результате этого изменения такая ошибка будет выдаваться как ошибка сериализации, если приложение явно проверяет присутствие конфликтующего ключа (и не находит его) до этого в транзакции.
Сообщения аннулирования должны записываться в WAL, даже если они выдаются транзакцией, которой не назначен XID (Андрес Фройнд)
Это решает проблемы в особых случаях, когда транзакции на резервных серверах не замечали некоторые изменения, например, создание индексов.
Предупреждение одновременной отработки несколькими процессами очереди изменений в индексе GIN (Фёдор Сигаев, Джефф Джейнс)
Это допускалось намеренно, но вызывало условия гонки, при которых процедура очистки пропускала записи в индексе, которые нужно было удалить.
E.57.3.2. Репликация и восстановление
Возможность при синхронной репликации задействовать одновременно несколько синхронных резервных серверов (раньше поддерживался только один) (Масахико Савада, Бина Эмерсон, Микаэль Пакье, Фудзии Масао, Кётаро Хоригути)
Число резервных серверов, которые должны подтвердить фиксацию, прежде чем она будет считаться завершённой, теперь устанавливается в значении параметра synchronous_standby_names.
Добавление нового значения
remote_applyдля конфигурационного параметра synchronous_commit (Томас Манро)В этом режиме главный сервер ждёт, пока транзакция не будет применена на резервном, а не просто сохранена на диске. Это значит, что можно рассчитывать, что транзакция, запущенная на резервном сервере, будет видеть все изменения, подтверждённые на главном.
Усовершенствование протокола репликации и добавление параметра в функцию
pg_create_physical_replication_slot()для немедленного резервирования WAL при создании слота репликации (Гуржит Сингх, Микаэль Пакье)Это позволяет при создании слота репликации гарантировать, что будут доступны все файлы WAL, нужные для базовой копии.
Добавление ключа
--slotдля pg_basebackup (Питер Эйзентраут)Это позволяет pg_basebackup использовать слот репликации, созданный для трансляции WAL. Выбрав тот же слот для обычной потоковой репликации после создания базовой резервной копии, можно запустить новый резервный сервер, не прерывая приём потока.
Доработка функций
pg_start_backup()иpg_stop_backup()для поддержки немонопольного резервного копирования (Магнус Хагандер)
E.57.3.3. Запросы
Функции, возвращающие наборы кортежей, теперь могут возвращать просто
NULL(Эндрю Гирт, Том Лейн)В контексте
SELECT FROM function(...)функция, возвращающая набор составных значений, не могла вернуть обычное значениеNULLв составе набора. Теперь это допускается и такой результат воспринимается как строка с полямиNULL. Это позволяет избежать ошибок в особых случаях, например, при разворачивании массива составных значений.Полная поддержка указаний индексов массивов и выбора полей в списке целевых столбцов команды
INSERTс несколькими строкамиVALUES(Том Лейн)Ранее в таких ситуациях возникала ошибка, если один и тот же целевой столбец упоминался более одного раза, например так:
INSERT INTO tab (x[1], x[2]) VALUES (...).Когда уместно, вычисление выходных выражений
SELECTоткладывается и производится после сортировкиORDER BY(Константин Книжник)В результате этого изменения изменчивые или дорогостоящие функции в выходном списке выполняются в порядке, установленном предложением
ORDER BY, и не будут вычисляться лишний раз, когда присутствует предложениеLIMIT. Ранее эта оптимизация имела место, когда сортировка выполнялась при сканировании индекса или перед соединением слиянием, но не когда она производилась на верхнем уровне запроса.Расширение счётчиков, хранящих число обработанных кортежей, до 64 бит (Андреас Шербаум)
В результате этого изменения в метках команд, например
SELECT, теперь будут корректно выдаваться количества кортежей, превышающие 4 миллиарда. Это также распространяется на командуGET DIAGNOSTICS ... ROW_COUNTв PL/pgSQL.Уход от преобразования некоторых кодировок через кодировку
MULE_INTERNAL(Том Лейн)Ранее преобразования кириллических и центральноевропейских однобайтовых кодировок зачастую выполнялись путём перевода в связанную схему
MULE_INTERNAL, и только затем в целевую кодировку. Помимо того, что это неэффективно, это означает, что при обнаружении непереводимого символа будет выдано некорректное сообщение об ошибке преобразования в/из кодировкиMULE_INTERNAL, а не кодировки, видимой пользователю.Допускать удалённое соединение сторонних таблиц, только если к ним обращается одна и та же роль (Шигеру Ханада, Ашутош Бапат, Эцуро Фудзита)
Ранее инфраструктура вынесения соединений наружу доверяла заботу о безопасности целиком обёрткам сторонних данных, но при этом в обёртке слишком легко могли непреднамеренно образовываться неочевидные уязвимости. Поэтому решено было в коде ядра определять, какая роль обращается к каждой таблице, и пытаться выносить соединение наружу, только если это одна роль для всех задействованных отношений.
E.57.3.4. Служебные команды
Поддержка в
COPYкопирования вывода запросаINSERT/UPDATE/DELETE...RETURNING(Марко Тииккая)Ранее для этого приходилось создавать промежуточные CTE (общие табличные выражения).
Введение команды
ALTER(Абхиджит Менон-Сен)объектDEPENDS ON EXTENSIONЭта команда позволяет пометить объект базы данных как зависимый от расширения, чтобы он автоматически ликвидировался при удалении расширения (без явного указания
CASCADE). Но при этом такой объект не будет частью расширения и поэтому pg_dump будет выгружать его отдельно.Команда
ALTERтеперь не будет делать ничего, если объект уже относится к заданной схеме, вместо того, чтобы выдавать ошибку, что имело место раньше для большинства типов объектов (Марти Раудсепп)объектSET SCHEMAДобавление в
ALTER OPERATORпараметров, позволяющих изменять функции оценки избирательности, связанные с существующим оператором (Юрий Журавлёв)Добавление указания
IF NOT EXISTSв командуALTER TABLE ADD COLUMN(Фабрицио де Ройес Мелло)Снижение уровня блокировок, запрашиваемых командой
ALTER TABLEпри установке фактора заполнения и параметров отношения, связанных с автоочисткой (Фабрицио де Ройес Мелло, Саймон Риггс)Введение команды
CREATE ACCESS METHOD, позволяющей расширениям создавать методы доступа индексов (Александр Коротков, Петр Желинек)Добавление указания
CASCADEдля командыCREATE EXTENSION, позволяющего автоматически устанавливать расширения, от которых зависит создаваемое (Петр Желинек)Команда
CREATE TABLE ... LIKEдолжна включать столбецOID, если он есть в какой-либо из исходных таблиц (Брюс Момджян)Если ограничение
CHECKобъявлено какNOT VALID(непроверенное) в команде создания таблицы, оно должно автоматически помечаться как проверенное (Амит Ланготе, Амул Сул)Это безопасно, так как в таблице ещё нет строк, и соответствует давно принятому поведению ограничений
FOREIGN KEY.Исправлена команда
DROP OPERATOR; она должна очищать ссылки на удаляемый операторpg_operator.oprcomиpg_operator.oprnegate(Рома Соколов)Ранее эти ссылки оставлялись как есть, что было чревато проблемами в довольно маловероятных случаях повторного использования
OIDудалённого оператора другим оператором.Один и тот же подплан не должен выдаваться дважды в выводе
EXPLAIN(Том Лейн)В некоторых случаях, обычно с узлами SubPlan в условиях индексов, команда
EXPLAINвыводила данные одного и того же подплана дважды.Запрет создания индексов по системным столбцам, за исключением
OID(Дэвид Роули)Такие индексы никогда не считались поддерживаемыми и провоцировали некорректное поведение, так как система могла менять значения системных столбцов, не обновляя индексы. Однако ранее отсутствовали проверки, которые бы мешали их создавать.
E.57.3.5. Управление разрешениями
Использование системы прав для управления доступом к важным функциям (Стивен Фрост)
Ранее многие требующие ограниченного доступа функции содержали жёстко зашитые проверки, которые выдавали ошибки, если эти функции пытался выполнять не суперпользователь. Это вынуждало применять роли суперпользователей для выполнения и некоторых заурядных задач. Теперь эти проверки ушли, вместо этого initdb отзывает у роли public право на выполнение (
EXECUTE) этих функций. Это позволяет на местах дать право использовать их доверенным ролям, которым не нужны все полномочия суперпользователей.Создание нескольких встроенных ролей, используя которые можно давать доступ к операциям, ранее доступным только суперпользователям (Стивен Фрост)
В настоящее время есть только одна такая роль,
pg_signal_backend, но в дальнейшем ожидается добавление других ролей.
E.57.3.6. Типы данных
Усовершенствование полнотекстового поиска; поддержка поиска фраз, то есть лексем, встречающихся рядом в определённом порядке, либо с заданным расстоянием между ними (Фёдор Сигаев, Олег Бартунов, Дмитрий Иванов)
Запрос поиска фразы может быть записан в значении
tsqueryс использованием новых операторов<->и<. Первая запись означает, что лексемы до и после неё должны находиться рядом и в заданном порядке. Вторая запись означает, что они могут быть разделены ровноN>Nлексемами.Возможность записать указание среза массива без одной или двух границ, например,