E.42. Выпуск 12

Дата выпуска: 2019-10-03

E.42.1. Обзор

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

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

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

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

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

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

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

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

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

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

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

    • Вывод информации о процессе выполнения команд CREATE INDEX, REINDEX, CLUSTER, VACUUM FULL и pg_checksums

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • Удаление расширения timetravel (Андрес Фройнд)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • Переименование утилиты командной строки pg_verify_checksums в pg_checksums (Микаэль Пакье)

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

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

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

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

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

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

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

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

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

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

  • Удаление ненужного столбца pg_constraint.consrc (Питер Эйзентраут)

    Этот столбец давно считался устаревшим, так как в нём не отражались косвенные изменения его содержимого в каталоге (например, переименования столбцов). Вместо него для получения в текстовом виде выражения ограничения-проверки из pg_constraint рекомендуется использовать функцию pg_get_expr(conbin, conrelid). Также для этого может быть полезна функция pg_get_constraintdef().

  • Удаление ненужного столбца pg_attrdef.adsrc (Питер Эйзентраут)

    Этот столбец давно считался устаревшим, так как в нём не отражались косвенные изменения его содержимого в каталоге (например, переименования столбцов). Вместо него для получения в текстовом виде выражения значения по умолчанию из pg_attrdef рекомендуется использовать функцию pg_get_expr(adbin, adrelid).

  • Назначение столбцам, имеющим тип name, по умолчанию правила сортировки «C» (Том Лейн, Даниэль Верите)

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

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

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

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

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

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

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

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

    В предыдущих выпусках недопустимые целочисленные значения для параметров подключения connect_timeout, keepalives, keepalives_count, keepalives_idle, keepalives_interval и port просто игнорировались кодом libpq или провоцировали некорректные сообщения об ошибках.

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

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

E.42.3.1. Сервер

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

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

  • Возможность ссылаться во внешних ключах на секционированные таблицы (Альваро Эррера)

  • Ускорение операции COPY при копировании данных в секционированные таблицы (Дэвид Роули)

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

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

  • Распространение заданного в CREATE TABLE указания табличного пространства на дочерние секции секционированной таблицы (Дэвид Роули, Альваро Эррера)

  • Исключение избыточной сортировки при сканировании секций в нужном порядке (Дэвид Роули)

  • Выполнение ALTER TABLE ATTACH PARTITION с более мягкими требованиями блокировки (Роберт Хаас)

  • Реализация функций для просмотра конфигурации секционирования (Микаэль Пакье, Альваро Эррера, Амит Ланготе)

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

  • Включение секционированных индексов в системное представление pg_indexes (Сурадж Хараге)

  • Добавление в psql команды \dP, показывающей секционированные таблицы и индексы (Павел Стехуле)

  • Улучшение отображения секционированных таблиц в выводе команд \d и \z в psql (Павел Стехуле, Микаэль Пакье, Альваро Эррера)

  • Исправление ошибок, в результате которых после ALTER TABLE DETACH PARTITION схема зависимостей могла оказаться некорректной. Вследствие этого, например, при удалении таблицы, ранее являвшейся секцией, могли не удалиться её индексы (Том Лейн)

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

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

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

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

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

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

  • Увеличение скорости добавления данных в индекс btree благодаря сокращению издержек, связанных с блокировками (Александр Коротков)

  • Поддержка дополнительных столбцов (INCLUDE) в индексах GiST (Андрей Бородин)

  • Реализация поддержки поиска ближайших соседей (KNN) с использованием индексов SP-GiST (Никита Глухов, Александр Коротков, Владислав Стержанов)

  • Уменьшение нагрузки на WAL при создании индексов GiST, GIN и SP-GiST (Анастасия Лубенникова, Андрей Лепихов)

  • Более эффективное выполнение сканирования только индекса применительно к индексам по нескольким столбцам (Константин Книжник)

  • Увеличение производительности сканирования при очистке индексов GiST (Андрей Бородин, Константин Кузнецов, Хейкки Линнакангас)

  • Удаление из индекса GiST пустых страниц на уровне листьев при выполнении VACUUM (Андрей Бородин)

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

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

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

  • Возможность встраивания общих табличных выражений (CTE) во внешний запрос (Андреас Карлссон, Эндрю Гирт, Давид Феттер, Том Лейн)

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

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

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

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

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

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

  • Предварительное вычисление функций LEAST и GREATEST с постоянными аргументами (Вик Фиринг)

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

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

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

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

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

  • Улучшение оптимизации соединений по столбцам типа tid (Том Лейн)

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

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

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

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

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

  • Ускорение поиска ключевых слов (Джон Нейлор, Йёрг Зонненбергер, Том Лейн)

  • Увеличение скорости поиска многобайтовых символов в position() и связанных функциях (Хейкки Линнакангас)

  • Реализация распаковки значений TOAST в минимально необходимом объёме (Пол Рамсей)

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

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

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

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

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

  • Ускорение преобразования строк в целочисленные типы int2 и int4 (Андрес Фройнд)

  • Возможность распараллеливания запросов в режиме изоляции SERIALIZABLE (Томас Манро)

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

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

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

  • Использование более быстрого метода изменения заголовка процесса во FreeBSD (Томас Манро)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • Ограничение видимости строк в pg_stat_ssl для непривилегированных пользователей (Питер Эйзентраут)

  • Вывод в журнал сообщения с номером версии сервера при запуске (Кристоф Берг)

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

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

  • Добавление в сообщения log_connections названия приложения (application_name), если оно задано (Дон Зейлер)

  • Использование в качестве альтернативного имени приложения walreceiver имени кластера, если оно задано (Питер Эйзентраут)

  • Добавление времени последнего полученного от ведомого сервера сообщения в представление pg_stat_replication (Лим Мёнгю)

  • Добавление события ожидания синхронизации с ФС сегментов WAL (Константин Книжник)

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

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

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

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

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

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

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

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

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

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

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

  • Возможность указания в параметрах сервера интервалов времени в микросекундах (us) (Том Лейн)

  • Допущение присваивания целочисленным параметрам сервера дробных значений (Том Лейн)

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

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

  • Добавление серверных параметров wal_recycle и wal_init_zero для управления переработкой файлов WAL (Джерри Джелинек)

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

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

  • Возможность ограничения минимальной и максимальной версии протокола SSL (Питер Эйзентраут)

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

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

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

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

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

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

    Эта возможность распространяется на параметры archive_cleanup_command, promote_trigger_file, recovery_end_command и recovery_min_apply_delay.

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

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

  • Реализация функции pg_promote() для повышения ведомого сервера до ведущего (Лауренц Альбе, Микаэль Пакье)

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

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

    Эту возможность предоставляют функции pg_copy_physical_replication_slot() и pg_copy_logical_replication_slot().

  • Исключение количества процессов max_wal_senders из max_connections (Александр Кукушкин)

  • Добавление явного значения current для recovery_target_timeline (Питер Эйзентраут)

  • Прерывание восстановления с ошибкой в случае повреждения файла состояния двухфазных транзакций (Микаэль Пакье)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • Реализация указания OR REPLACE для CREATE AGGREGATE (Эндрю Гирт)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

E.42.3.5. Функции

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

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

  • Добавление поддержки гиперболических функций (Летиция Авро)

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

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

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

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

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

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

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

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

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

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

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

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

E.42.3.6. PL/pgSQL

  • Разрешение конфликта имён переменных с именами SQL-команд при попытке использованиях этих команд в функции PL/pgSQL (Том Лейн)

    Например, теперь переменная comment может сосуществовать в функции с вызовом SQL-команды COMMENT SQL. Ранее подобное сочетание вызывало ошибку разбора.

  • Добавление в PL/pgSQL новых отключаемых проверок ошибок и предупреждений (Павел Стехуле)

    Новые проверки позволяют контролировать количество столбцов и отсутствие лишних строк в результате INTO.

E.42.3.7. Клиентские интерфейсы

  • Добавление параметра соединения tcp_user_timeout для управления тайм-аутом TCP-подключений со стороны libpq (Рёхэй Нагаура)

  • Возможность получения в сообщениях об ошибках, которые выдаёт libpq (а значит, и psql), только значений SQLSTATE (Дидье Готрон)

  • Добавление в libpq функции PQresultMemorySize(), позволяющей узнать, какой объём занял результат запроса в памяти (Ларс Канис, Том Лейн)

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

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

  • Возможность создания в ecpg переменных типа данных bytea (Рё Мацумура)

    Теперь клиенты ECPG могут работать с данными bytea непосредственно, без преобразования в текстовое представление.

  • Реализация поддержки PREPARE AS в ECPG (Рё Мацумура)

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

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

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

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

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

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

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

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

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

  • Отображение адреса соответствующей страницы документации в выводе psql \help для SQL-команды (Питер Эйзентраут)

  • Отображение IP-адреса в выводе psql \conninfo (Фабьен Коэльо)

  • Улучшение дополнения табуляцией для команд CREATE TABLE, CREATE TRIGGER, CREATE EVENT TRIGGER, ANALYZE, EXPLAIN, VACUUM, ALTER TABLE, ALTER INDEX, ALTER DATABASE и ALTER INDEX ALTER COLUMN (Дагфинн Ильмари Маннсакер, Тацуро Ямада, Микаэль Пакье, Том Лейн, Джастин Призби)

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

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

  • Увеличение точности параметра pgbench --rate (Том Лейн)

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

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

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

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

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

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

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

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

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

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

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

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

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

  • Исправление в pg_test_fsync измерения длительности open_datasync в Windows (Лауренц Альбе)

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

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

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

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

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

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

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

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

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

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

  • Добавление команды CREATE ACCESS METHOD для создания новых типов таблиц (Андрес Фройнд, Харибабу Комми, Альваро Эррера, Александр Коротков, Дмитрий Долгов)

    Это позволяет разрабатывать новые табличные методы доступа с целью оптимизации хранения данных для различных сценариев использования. Существующий метод доступа heap остаётся методом по умолчанию.

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

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

  • Упрощение перенумерации значений OID, назначаемых вручную, и принятие в рамках проекта новой политики управления такими OID (John Naylor, Tom Lane)

    В разрабатываемых модификациях кода, требующих назначения OID для новых встроенных объектов (например, новых функций), эти значения должны выбираться случайным образом в диапазоне 8000—9999. В конце цикла разработки и перед принятием этих модификаций использованные в них OID перенумеруются и получают значения в нижнем диапазоне, в настоящее время 4xxx, с помощью нового скрипта renumber_oids.pl. Этот подход значительно уменьшает вероятность конфликтов OID между параллельно разрабатываемыми модификациями кода.

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

  • Сборка исполняемых файлов Cygwin с использованием динамических, а не статических библиотек (Марко Атзери)

  • Ликвидация параметра configure --disable-strong-random (Микаэль Пакье)

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

  • Унифицирование поведения функций семейства printf, а также strerror и strerror_r на разных платформах в рамках кода PostgreSQL (Том Лейн)

    А именно, printf теперь воспринимает %m везде, в Windows strerror полноценно обрабатывает коды ошибок Winsock (раньше они обрабатывались в клиентском, но не в серверном коде), а результат strerror_r всегда соответствует соглашению GNU.

  • Требование компилятора, совместимого с C99, и MSVC 2013 или новее в Windows (Андрес Фройнд)

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

    Это касается только файла INSTALL, генерируемого в результате make dist и редко требующегося текстового файла postgres.txt. Pandoc по сравнению с lynx выдаёт более качественный результат и решает ряд проблем с кодировкой/локалью. Версия pandoc должна быть не ниже 1.13.

  • Поддержка включения иллюстраций в документацию PostgreSQL (Юрген Пуртц)

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

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

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

  • Исправление поведения представлений, обращающихся к таблицам postgres_fdw и имеющих свойство CHECK OPTION (Эцуро Фудзита)

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

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

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

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

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

  • Обновление правил unaccent, включающее добавление новых знаков пунктуации и символов (Хью Раналли, Микаэль Пакье)

  • Реализация в unaccent обработки знаков ударения, представленных в составных символах (Хью Раналли)

  • Реализация в unaccent удаления знаков ударения из греческих символов (Тасос Масхалидис)

  • Добавление в функцию bt_index_parent_check() в модуле amcheck параметра для проверки каждого кортежа индекса, начиная от корня (Питер Гейган)

  • Приведение порядка обработки параметров oid2name и vacuumlo в соответствие с принятым в других командах (Тацуро Ямада)

E.42.4. Благодарственный список

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

Абхиджит Менон-Сен (Abhijit Menon-Sen)
Адам Беланьский (Adam Bielanski)
Адам Берлин (Adam Berlin)
Адитья Тошнивал (Aditya Toshniwal)
Адриен Найрат (Adrien Nayrat)
Айзек Морленд (Isaac Morland)
Алан Джексон (Alan Jackson)
Алекс Мейси (Alex Macy)
Александр Акципетров (Alex Aktsipetrov)
Александр Алексеев (Aleksander Alekseev)
Александр Коротков (Alexander Korotkov)
Александр Кузьменков (Alexander Kuzmenkov)
Александр Кукушкин (Alexander Kukushkin)
Александр Лахин (Alexander Lakhin)
Александра Рыжевич (Alexandra Ryzhevich)
Алексей Баштанов (Alexey Bashtanov)
Алексей Ермаков (Alexey Ermakov)
Алексей Клюкин (Alex Kliukin)
Алексей Клюкин (Oleksii Kliukin)
Алексей Кондратов (Alexey Kondratov)
Алексей Крючков (Alexey Kryuchkov)
Алексей Степанов (Alexey Stepanov)
Алисса Росс (Alyssa Ross)
Аллисон Каптур (Allison Kaptur)
Альберт Шабхютль (Albert Schabhuetl)
Альваро Эррера (Álvaro Herrera)
Амит Капила (Amit Kapila)
Амит Ланготе (Amit Langote)
Амит Хандекар (Amit Khandekar)
Амул Сул (Amul Sul)
Анастасия Лубенникова (Anastasia Lubennikova)
Андре Гензель (André Hänsel)
Андреа Джельмини (Andrea Gelmini)
Андреас Джозеф Крог (Andreas Joseph Krogh)
Андреас Зельтенрейх (Andreas Seltenreich)
Андреас Карлссон (Andreas Karlsson)
Андреас Кунерт (Andreas Kunert)
Андреас Шербаум (Andreas Scherbaum)
Андрей Бородин (Andrey Borodin)
Андрей Егоров (Andrei Yahorau)
Андрей Клычков (Andrey Klychkov)
Андрей Красичков (Andrew Krasichkov)
Андрей Лепихов (Andrey Lepikhov)
Андрес Фройнд (Andres Freund)
Антонин Хоуска (Antonin Houska)
Арне Роланд (Arne Roland)
Арсений Шер (Arseny Sher)
Артур Закиров (Artur Zakirov)
Ахиллес Манциос (Achilleas Mantzios)
Аш Марат (Ash Marath)
Ашвин Агравал (Ashwin Agrawal)
Ашутош Бапат (Ashutosh Bapat)
Ашутош Шарма (Ashutosh Sharma)
Ая Ивата (Aya Iwata)
Бартош Полник (Bartosz Polnik)
Бейзил Бурк (Basil Bourque)
Бернд Хелмле (Bernd Helmle)
Брижит Блан-Лафей (Brigitte Blanc-Lafay)
Бруно Вольф (Bruno Wolff)
Брэд Дейонг (Brad DeJong)
Брюс Кляйн (Bruce Klein)
Брюс Момджян (Bruce Momjian)
Вайшнави Прабакаран (Vaishnavi Prabakaran)
Виджайкумар Джайн (Vijaykumar Jain)
Вик Фиринг (Vik Fearing)
Виктор Вагнер (Victor Wagner)
Виктор Егоров (Victor Yegorov)
Виктор Петровых (Victor Petrovykh)
Владимир Баранов (Vladimir Baranoff)
Владимир Крюков (Vladimir Kriukov)
Владислав Стержанов (Vlad Sterzhanov)
Ву Фей (Wu Fei)
Габи Шильдерс (Gaby Schilders)
Георгий Тарасов (George Tarasov)
Георгиос Коколатос (Georgios Kokolatos)
Герт Лоббесталь (Geert Lobbestael)
Гийом Леларж (Guillaume Lelarge)
Грег Старк (Greg Stark)
Григорий Смолкин (Grigory Smolkin)
Гуннлаугур Тор Брием (Gunnlaugur Thor Briem)
Гуржит Сингх (Gurjeet Singh)
Давид Феттер (David Fetter)
Даг Рэди (Doug Rady)
Дагфинн Ильмари Маннсакер (Dagfinn Ilmari Mannsåker)
Дайсукэ Хигути (Daisuke Higuchi)
Даниель Вестерман (Daniel Westermann)
Даниэль Верите (Daniel Vérité)
Даниэль Вильчес (Daniel Wilches)
Даниэль Густафссон (Daniel Gustafsson)
Даниэль Фиори (Daniel Fiori)
Деврим Гюндюз (Devrim Gündüz)
Дейв Крамер (Dave Cramer)
Дерек Ганс (Derek Hans)
Дерек Нельсон (Derek Nelson)
Джанни Чиолли (Gianni Ciolli)
Джастин Призби (Justin Pryzby)
Джейкоб Чемпион (Jacob Champion)
Джеймс Информ (James Inform)
Джеймс Коулман (James Coleman)
Джеймс Робинсон (James Robinson)
Джеймс Сьюэлл (James Sewell)
Джеймс Томсон (James Tomson)
Джек Келли (Jack Kelly)
Джереми Смит (Jeremy Smith)
Джереми Шнайдер (Jeremy Schneider)
Джереми Эванс (Jeremy Evans)
Джерри Джелинек (Jerry Jelinek)
Джеспер Педерсен (Jesper Pedersen)
Джефф Девис (Jeff Davis)
Джефф Джейнс (Jeff Janes)
Джи Чжан (Jie Zhang)
Дживан Ладхе (Jeevan Ladhe)
Дживан Чок (Jeevan Chalke)
Джим Нэсби (Jim Nasby)
Джимми Йи (Jimmy Yih)
Джо Вайлдиш (Joe Wildish)
Джо Конвей (Joe Conway)
Джон Кланн (John Klann)
Джон Нейлор (John Naylor)
Джона Харрис (Jonah Harris)
Джонатан С. Кац (Jonathan S. Katz)
Джошуа Д. Дрейк (Joshua D. Drake)
Джулиан Маркворт (Julian Markwort)
Джулиан Сяо (Julian Hsiao)
Джулиан Шаудер (Julian Schauder)
Диан Фей (Dian Fay)
Дидье Готрон (Didier Gautheron)
Дилип Кумар (Dilip Kumar)
Дин Рашид (Dean Rasheed)
Дмитрий Долгов (Dmitry Dolgov)
Дмитрий Маракасов (Dmitry Marakasov)
Дмитрий Молотков (Dmitry Molotkov)
Дмитрий Шалашов (Dmitry Shalashov)
Дон Зейлер (Don Seiler)
Дональд Донг (Donald Dong)
Дорофей Пролесковский (Darafei Praliaskouski)
Дэви Мачадо (Davy Machado)
Дэвид Биндерман (David Binderman)
Дэвид Дж. Джонстон (David G. Johnston)
Дэвид Роули (David Rowley)
Дэвид Стил (David Steele)
Дэрил Вэйкотт (Daryl Waycott)
Евгений Коньков (Eugen Konkov)
Ёсикадзу Имаи (Yoshikazu Imai)
Жан-Кристоф Арну (Jean-Christophe Arnu)
Жан-Мар Вуалекин (Jean-Marc Voillequin)
Жан-Пьер Пельтье (Jean-Pierre Pelletier)
Жиль Даролд (Gilles Darold)
Жорж Густаву Роша (Jorge Gustavo Rocha)
Жуй Хай Цзян (Rui Hai Jiang)
Жюльен Руо (Julien Rouhaud)
И Хуан (Yi Huang)
Ибрар Ахмед (Ibrar Ahmed)
Иван Панченко (Ivan Panchenko)
Ильдар Мусин (Ildar Musin)
Инсон Мун (Insung Moon)
Иэн Барвик (Ian Barwick)
Йозеф Ким (Ioseph Kim)
Йёрг Зонненбергер (Joerg Sonnenberger)
Кайл Самсон (Kyle Samson)
Кайтин Чен (Kaiting Chen)
Карен Хаддлстон (Karen Huddleston)
Карл О. Пинц (Karl O. Pinc)
Карл Чайковски (Karl Czajkowski)
Квентин Рамо (Quentin Rameau)
Кевин Гриттнер (Kevin Grittner)
Кевин Хейл Бойс (Kevin Hale Boyes)
Кен Танцер (Ken Tanzer)
Киран Маккаскер (Kieran McCusker)
Кирк Джемисон (Kirk Jamison)
Кит Фиске (Keith Fiske)
Клеменс Ладиш (Clemens Ladisch)
Колм Макхью (Colm McHugh)
Константин Книжник (Konstantin Knizhnik)
Константин Кузнецов (Konstantin Kuznetsov)
Кори Хинкер (Corey Huinker)
Кохэй КайГай (Kohei KaiGai)
Крейг Рингер (Craig Ringer)
Крис Вилсон (Chris Wilson)
Крис Трэверс (Chris Travers)
Кристиан Таммекиви (Kristjan Tammekivi)
Кристиан Хофстедтлер (Christian Hofstaedtler)
Кристоф Берг (Christoph Berg)
Кристоф Мёнх-Тегедер (Christoph Moench-Tegeder)
Кунтал Гхош (Kuntal Ghosh)
Кэйити Хиробэ (Keiichi Hirobe)
Кэндзи Уно (Kenji Uno)
Кётаро Хоригути (Kyotaro Horiguchi)
Ларс Канис (Lars Kanis)
Лауренц Альбе (Laurenz Albe)
Летиция Авро (Lætitia Avrot)
Лим Мёнгю (Lim Myungkyu)
Ллойд Альбин (Lloyd Albin)
Луис М. Карриль (Luis M. Carril)
Лука Феррари (Luca Ferrari)
Лукас Фиттл (Lukas Fittl)
Лукас Эдер (Lukas Eder)
Лю Хуайлин (Liu Huailing)
Людмила Мантрова (Liudmila Mantrova)
Магнус Хагандер (Magnus Hagander)
Мадлен Тибо (Madelaine Thibaut)
Мадлен Томпсон (Madeleine Thompson)
Май Пэн (Mai Peng)
Майк Пальмиотто (Mike Palmiotto)
Майкл Витале (Michael Vitale)
Майкл Дэвидсон (Michael Davidson)
Максим Богук (Maksym Boguk)
Максим Милютин (Maksim Milyutin)
Мальте Борх (Malthe Borch)
Мануэль Риггер (Manuel Rigger)
Марина Полякова (Marina Polyakova)
Марио де Фрутос Диегес (Mario De Frutos Dieguez)
Мариус Тиммер (Marius Timmer)
Марк Дилгер (Mark Dilger)
Марк Чемберс (Mark Chambers)
Марко Атзери (Marco Atzeri)
Марко Слот (Marco Slot)
Марко Тииккая (Marko Tiikkaja)
Маркус Винанд (Markus Winand)
Мартин Маркес (Martín Marqués)
Масао Фудзии (Masao Fujii)
Масахико Савада (Masahiko Sawada)
Матвей Арье (Matvey Arye)
Матеуш Гузик (Mateusz Guzik)
Матиас Броссар (Mathias Brossard)
Маттиас Оттербах (Matthias Otterbach)
Махендра Сингх (Mahendra Singh)
Мелани Плейгман (Melanie Plageman)
Ми Тар (Mi Tar)
Микаэль Пакье (Michael Paquier)
Миколай Кейда (Mikalai Keida)
Митхун Сай (Mithun Cy)
Михаэль Банк (Michael Banck)
Михаэль Мескес (Michael Meskes)
Мишель Пельтье (Michel Pelletier)
Морган Оуэнс (Morgan Owens)
Мурат Кабилов (Murat Kabilov)
Мэтт Вильямс (Matt Williams)
Наваз Ахмед (Nawaz Ahmed)
Натан Боссарт (Nathan Bossart)
Ник Барнс (Nick Barnes)
Никита Глухов (Nikita Glukhov)
Нико Вильямс (Nico Williams)
Николай Шаплов (Nikolay Shaplov)
Нин Ю (Ning Yu)
Нирадж Кумар (Neeraj Kumar)
Нишант Фну (Nishant Fnu)
Ной Миш (Noah Misch)
Норберт Бенкокс (Norbert Benkocs)
Нориёси Синода (Noriyoshi Shinoda)
Олег Бартунов (Oleg Bartunov)
Олег Самойлов (Oleg Samoilov)
Ондрей Буда (Ondrej Bouda)
Оскари Сааренмаа (Oskari Saarenmaa)
Паван Деоласи (Pavan Deolasee)
Павел Оськин (Pavel Oskin)
Павел Райскуп (Pavel Raiskup)
Павел Стехуле (Pavel Stehule)
Пан Бянь (Pan Bian)
Патрик Макхарди (Patrick McHardy)
Патрик Франсель (Patrick Francelle)
Пауль ван дер Линден (Paul van der Linden)
Петер Биллен (Peter Billen)
Петр Желинек (Petr Jelínek)
Петр Славов (Petr Slavov)
Петру-Флорин Миханча (Petru-Florin Mihancea)
Питер Гейган (Peter Geoghegan)
Питер Нив (Peter Neave)
Питер Эйзентраут (Peter Eisentraut)
Пол А. Юнгвирт (Paul A. Jungwirth)
Пол Гуо (Paul Guo)
Пол Мартинес (Paul Martinez)
Пол Рамсей (Paul Ramsey)
Пол Схап (Paul Schaap)
Поль Боно (Paul Bonaud)
Прабхат Саху (Prabhat Sahu)
Пьер Дюкроке (Pierre Ducroquet)
Пэйфэн Цю (Peifeng Qiu)
Пётр Влодарчик (Piotr Wlodarczyk)
Пётр Габриэль Косински (Piotr Gabriel Kosinski)
Пётр Стефаняк (Piotr Stefaniak)
Пётр Фёдоров (Petr Fedorov)
Раджкумар Рагхуванши (Rajkumar Raghuwanshi)
Райан Ламберт (Ryan Lambert)
Рамакришна Корлапати (RK Korlapati)
Рареш Салкудян (Rares Salcudean)
Рауль Марин Родригес (Raúl Marín Rodríguez)
Рафаэль Кастро (Rafael Castro)
Рафия Сабих (Rafia Sabih)
Рахила Сьед (Rahila Syed)
Регина Обе (Regina Obe)
Рено Наварро (Renaud Navarro)
Рик Оттен (Rick Otten)
Рикард Фалькеборн (Rikard Falkeborn)
Ричард Гуо (Richard Guo)
Робби Харвуд (Robbie Harwood)
Роберт Трит (Robert Treat)
Роберт Фольмерт (Robert Vollmert)
Роберт Хаас (Robert Haas)
Роджер Кёрли (Roger Curley)
Роман Жарков (Roman Zharkov)
Ронан Данклау (Ronan Dunklau)
Рушаб Латиа (Rushabh Lathia)
Рё Мацумура (Ryo Matsumura)
Рёхэй Нагаура (Ryohei Nagaura)
Рёхэй Такахаси (Ryohei Takahashi)
Саймон Риггс (Simon Riggs)
Саньо Капобьянго (Sanyo Capobiango)
Сатору Коидзуми (Satoru Koizumi)
Сергей Корнилов (Sergei Kornilov)
Сергей Латынцев (Serge Latyntsev)
Сергей Пашков (Sergey Pashkov)
Серхио Конде Гомес (Sergio Conde Gómez)
Славомир Ходницки (Slawomir Chodnicki)
Стас Кельвич (Stas Kelvich)
Степан Янкевич (Stepan Yankevych)
Стив Роджерсон (Steve Rogerson)
Стив Сингер (Steve Singer)
Стивен Амелл (Stephen Amell)
Стивен Винфилд (Steven Winfield)
Стивен Фрост (Stephen Frost)
Сурадж Хараге (Suraj Kharage)
Сурафел Темесген (Surafel Temesgen)
Суреш Кумар Р (Suresh Kumar R)
Сэмюэл Вильямс (Samuel Williams)
Сэнд Стоун (Sand Stone)
Сёхей Мотидзуки (Shohei Mochizuki)
Такаюки Цунакава (Takayuki Tsunakawa)
Такума Хосиай (Takuma Hoshiai)
Такэси Идэриха (Takeshi Ideriha)
Тасос Масхалидис (Tasos Maschalidis)
Тацуо Исии (Tatsuo Ishii)
Тацуро Ямада (Tatsuro Yamada)
Тильман Шульц (Tillmann Schulz)
Тим Мёльман (Tim Möhlmann)
Тимур Бирш (Timur Birsh)
Тобиас Бусман (Tobias Bussmann)
Том Браун (Thom Brown)
Том Готтфрид (Tom Gottfried)
Том Дунстан (Tom Dunstan)
Том Кэссиди (Tom Cassidy)
Том Лейн (Tom Lane)
Томас Манро (Thomas Munro)
Томас Поти (Thomas Poty)
Томаш Вондра (Tomas Vondra)
Тушар Ахуджа (Tushar Ahuja)
Ульф Адамс (Ulf Adams)
Фабрицио де Ройес Мелло (Fabrízio de Royes Mello)
Фабьен Коэльо (Fabien Coelho)
Фейке Стинберген (Feike Steenbergen)
Фил Байер (Phil Bayer)
Фил Флорент (Phil Florent)
Филип Рембялковский (Filip Rembialkowski)
Филипп Дюбе (Philip Dubé)
Фёдор Сигаев (Teodor Sigaev)
Хади Мошаеди (Hadi Moshayedi)
Хайато Курода (Hayato Kuroda)
Хайлун Ли (Hailong Li)
Хайме Казанова (Jaime Casanova)
Ханс Бушман (Hans Buschmann)
Харибабу Комми (Haribabu Kommi)
Харука Такацука (Haruka Takatsuka)
Хейкки Линнакангас (Heikki Linnakangas)
Хиронобу Судзуки (Hironobu Suzuki)
Хосе Артур Бенетассо Вилланова (José Arthur Benetasso Villanova)
Хуан Хосе Сантамария Флеча (Juan José Santamaría Flecha)
Хуберт Любачевски (Hubert Lubaczewski)
Хью Раналли (Hugh Ranalli)
Цзянин Ян (Jianing Yang)
Чепмен Флэк (Chapman Flack)
Чжоу Дигоал (Zhou Digoal)
Чэнь Хуацзюнь (Chen Huajun)
Шивасубраманьян Рамасубраманьян (Sivasubramanian Ramasubramanian)
Шо Като (Sho Kato)
Шон Дебнатх (Shawn Debnath)
Шон Джонстон (Sean Johnston)
Шою Ло (Shouyu Luo)
Штефан Кадов (Stefan Kadow)
Шэй Роджански (Shay Rojansky)
Эдвардс Безверхийс (Eduards Bezverhijs)
Эдмунд Хорнер (Edmund Horner)
Эйлер Тавейра (Euler Taveira)
Элвис Пранскевичус (Elvis Pranskevichus)
Эмануэль Араужо (Emanuel Araújo)
Эмре Хасегели (Emre Hasegeli)
Энди Абелисто (Andy Abelisto)
Эндрю Гирт (Andrew Gierth)
Эндрю Дунстан (Andrew Dunstan)
Эндрю Флетчер (Andrew Fletcher)
Энтони Грин (Anthony Greene)
Энтони Скорски (Anthony Skorski)
Эрик Кир (Eric Cyr)
Эрик Рижкерс (Erik Rijkers)
Эртугрул Кахведжи (Ertugrul Kahveci)
Эцуро Фудзита (Etsuro Fujita)
Юго Нагата (Yugo Nagata)
Юзуко Хосоя (Yuzuko Hosoya)
Юймин Ван (Yuming Wang)
Юлиан Ходорковский (Yulian Khodorkovskiy)
ЮньЦян Су (YunQiang Su)
Юрген Пуртц (Jürgen Purtz)
Юрген Штробель (Jürgen Strobel)
Юрий Куренков (Yuri Kurenkov)
Юсукэ Эгашира (Yusuke Egashira)
Якоб Еггер (Jakob Egger)
Якуб Глапа (Jakub Glapa)
Якуб Янечек (Jakub Janecek)
Ян Хохол (Jan Chochol)
Ярослав Сивы (Jaroslav Sivy)
Ярослав Щёкин (Yaroslav Schekin)