Новый релиз PostgreSQL 9.6: вклад Postgres Professional

PostgreSQL Источник: Postgres Professional

Вчера, 29 сентября 2016 года, вышел новый релиз PostgreSQL, получивший номер 9.6. В нём содержится много весьма полезных фич, и нельзя не рассказать о них, тем более что вклад нашей компании в этот релиз существенен. Поэтому в этой статье мы расскажем о тех разработках Postgres Pro, которые вошли в сегодняшний релиз. Часть из них ранее была выпущена в рамках СУБД Postgres Pro 9.5, а теперь доступна и в PostgreSQL.

Полный список новшеств этой версии можно прочитать в Release notes.

Производительность и мониторинг

Улучшение представления pg_stat_activity в части информации об ожидающих процессах (Amit Kapila, Ильдус Курбангалиев).

Ранее в pg_stat_activity ожидающими считались процесссы, висящие на тяжелых (heavyweight) блокировках. Теперь там видны также ожидания легких блокировок (lightweight locks) и buffer-pins (как это по-русски?). О разных видах блокировок в постгресе можно прочитать в статье Александра Короткова. Новая информация видна в колонках wait_event_type и wait_event . Подробную информацию об этом патче можно прочитать в нашем блоге и в документации.

 

Эффективное использование памяти при построении GIN-индексов. (Robert Abraham, Фёдор Сигаев)

Теперь при построении GIN-индексов более эффективно используется память, если ее выделено (maintenance_work_mem) более гигабайта. Детали - в списке рассылки.

 

Немедленное освобождение удаляемых страниц GIN-индексов (Jeff Janes, Фёдор Сигаев).

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

 

Эффективная обработка мертвых узлов в GiST-индексах (Анастасия Лубенникова)

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

 

Замена спинлоков на атомарные операции  (Александр Коротков, Andres Freund)

Повышает вертикальную масштабируемость за счет более эффективной реализации блокировок. Ранее эта оптимизация была выпущена в Postgres Pro 9.5. Подробности в статье Александра Короткова.

 

Оптимизация ожидания блокировок (Александр Алексеев)

Изменения в алгоритме ожидания блокировок, дающие заметный вклад на многопроцессорных серверах. Ранее эта оптимизация была выпущена в Postgres Pro 9.5.  Подробности в списке рассылки.

 

Улучшение производительности ResourceOwner (Александр Алексеев)

Линейный поиск заменен на нечто более эффективное. Ранее эта оптимизация была выпущена в Postgres Pro 9.5.  Подробности в списке рассылки.

 

Вычисление выражений в SELECT после ORDER и LIMIT, если это возможно (Konstantin Knizhnik)

Теперь, если результаты  выражения не попадут в выдачу запроса и не участвуют в условиях выборки и группировки,  оно не будет вычисляться. Это сокращает количество вызовов функций (возможно, тяжелых). Кроме того, вызов функций будет осуществляться в порядке, задаваемом ORDER BY,  а иногда это важно. Подробности в списке рассылки.

 

Добавлены функции оценки селективности для contrib/intarray (Юрий Журавлев, Александр Коротков)

Это улучшает работу планировщика с запросами, в которых задействованы поля типа int[]. Подробности в списке рассылки .

 

Полнотекстовый поиск

Поиск фраз - новая возможность полнотекстового поиска (Фёдор Сигаев, Олег Бартунов, Дмитрий Иванов)

Ранее поиск фраз поддерживался только в Postgres Pro. Подробности на слайдах и в документации полнотекстового поиска.

 

Парсер полнотекстового поиска теперь понимает лидирующие цифры в e-mail'ах и именах хостов (Артур Закиров)

Это помогает правильно индексировать тексты, содержащие e-mail'ы и урлы. Нужно перестроить tsvector'ы, сгенерированные с использованием предыдущей версии. Подробная информация о патче - в списке рассылки.

 

Поддержка словарей Hunspell и увеличение количества поддерживаемых языков (Артур Закиров)

Ранее эти словари поддерживались только в Postgres Pro. Подробности в списке рассылки и в документации.

 

Новые полезные функции для работы с tsvector (Стас Кельвич)

Подробности в списке рассылки и в документации.

 

Функции ts_stat() и tsvector_update_trigger() теперь оперируют с данными бинарно совместимых типов (Фёдор Сигаев).

Подробности в списке рассылки.

 

Расширяемость и расширения

Добавлен класс операторов в SP-GiST для типа  box (Александр Лебедев)

Подробности в списке рассылки .

 

Добавление опций в ALTER OPERATOR, позволяющих указывать функции селективности для операторов (Юрий Журавлев)

Подробности в списке рассылки.

 

Новая конструкция CREATE ACCESS METHOD, позволяющая создавать индексные методы доступа в расширениях PostgreSQL (Александр Коротков, Petr Jelínek)

Подробности на слайдах .

 

Упрощение API индексных методов доступа (Александр Коротков, Andrew Gierth)

API индексных методов доступа изменен, чтобы в большей соответствовать концепциям, используемым в FDW и Tablesample. Это упрощает C-шный код и облегчает создание новых методов доступа в устанавливаемые расширения. Количество колонок в системной таблице pg_am уменьшилось, и появились новые функции для доступа к параметрам методов доступа из SQL. Подробности на слайдах .

 

Добавлен обобщенный интерфейс для записи WAL (Александр Коротков, Petr Jelínek, Markus Nullmeier)

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

 

Классы операторов SP-GiST operator classes теперь могут сохранять некоторое значение (“traversal value”) в процессе обхода индекса (Александр Лебедев, Фёдор Сигаев)

Подробности в списке рассылки .

 

Новый модуль  contrib/bloom реализует метод индексного доступа на основе блумовской фильтрации (Фёдор Сигаев, Александр Коротков)

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

 

В расширении contrib/cube введен оператор расстояния для кубов и поддержка kNN-поиска для GiST-индексов по колонкам типа cube (Стас Кельвич)

Подробности в списке рассылки.

Разное

В срезе массива теперь можно не указывать левую или правую границу (Юрий Журавлев)

Например,  array_col[3:]. Подробности в списке рассылки .

 

Улучшение pg_rewind: возможность работы с измененной целевой линией времени (Александр Коротков)

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

 

Улучшения модуля pageinspect (Николай Шаплов)

Функция heap_page_items() модуля contrib/pageinspect’s показывает сырые данные записи. Новые функции  tuple_data_split() и heap_page_item_attrs() позволяют заглянуть внутрь индивидуальных полей.

Подробности на слайдах .

 

Добавлена поддержка “похожести слов”  в модуле contrib/pg_trgm (Александр Коротков, Артур Закиров)

Можно измерить степень похожести между строкой и наиболее похожим на нее словом другой строки.

Подробности в списке рассылки.

 

В модуле contrib/pg_trgm добавлен параметр конфигурации pg_trgm.similarity_threshold (Артур Закиров)

Порогом похожести теперь можно управлять через конфигурационный параметр. Раньше это делалось только через специальные функции set_limit() и show_limit(). Подробности в списке рассылки .