Skip to content

Instantly share code, notes, and snippets.

@lesovsky
Created August 11, 2021 11:38
Show Gist options
  • Save lesovsky/e3b37e16df5b6d1ee9e129480d461a3b to your computer and use it in GitHub Desktop.
Save lesovsky/e3b37e16df5b6d1ee9e129480d461a3b to your computer and use it in GitHub Desktop.
PostgreSQL 13

PostgreSQL 13

Major features:

  • Оптимизация хранения и производительности за счет дедупликации в B-tree индексах.
  • Улучшение производительности запросов с использованием агрегатов или работающих с партицонированными таблицами.
  • Улучшенное планирование запросов с использованием расширенной статистики.
  • Параллельное вакуумирование индексов.
  • Инкрементальная сортировка.
  • дубликаты элементов в индексах есть всегда и это ОК.
  • дубликаты это плохо, т.к. расходуется место, IO, влияет на latency запросов.
  • дедупликация объединяет группы дубликатов тем самым устраняя их.
    • срабатывает при вставке элемента в случае если она не помещается в страницу
    • вставка происходит в отдельный список тем самым избегая (либо откладывая) page split (и увеличение индекса)
  • профиты:
    • индекс занимает меньше места
    • быстрый обход индекса, меньше IO, меньше latency
    • меньше bloat
  • применяемость:
    • проектировалось для смешанной read-write нагрузки
    • не подходит для write-heavy нагрузки с отсутствующей или небольшой вероятностью возникновения дубликатов (append-only), может быть небольшой performance penalty
    • бессмысленно для read-only нагрузки, при этом нет performance penalty, т.к. с точки зрения IO чтение списка эквивалентно чтению обычной страницы индекса
  • ограничения:
    • может быть небезопасно при использовании с типами text, varchar и char и при использовании nondeterministic таблиц сравнения.
    • не может использоваться с типами numeric, jsonb, float4, float8
    • не может использоваться с композитными типами вроде arrays, ranges (может быть устранено в будущих версиях)
    • не может использоваться с INCLUDE индексами
  • настройка через storage параметр deduplicate_items, по-умолчанию - включено.

Query performance with aggregates and partitioned tables.

  • Расширение случаев применения pruning техники.
  • Расширение случаев использования partitionwise joins операции.
    • отключено по-умолчанию, то есть нужно заранее представлять под какие запросы это следует включать и что это действительно будет полезно.

Better query planning when using extended statistics

  • CREATE STATISTICS
  • Добавлена поддержка statistics target.
  • Добавлена возможность пользоваться несколькими статистиками в одном запросе.
  • Добавлена поддержка статистики для OR условий и константных списков IN/ANY.

Parallelized vacuuming of indexes

  • поддержка параллельной обработки индексов для VACUUM.
  • необходимо в команде VACUUM указать ключевое слово PARALLEL n, где n - количество воркеров.

Incremental sorting

  • сортировка только тех строк для которых это действительно необходимо (для случаев когда часть строк была отсортирована в других узлах запроса).
  • можно контролировать через enable_incremental_sort, по-умолчанию включено.
  • меньше утилизация CPU, меньше latency

Other stuff

партиционирование:

  • частичная поддержка row-level BEFORE триггеров.
  • поддержка логической репликации через механизм публикаций
  • поддержка логической репликации в партиционированные таблицы на стороне подписчика

Отслеживание и запуск авто-вакуума для insert-only таблиц (row freezing, visibility maps)

Поддержка изменения параметров primary_conninfo, primary_slot_name через reload конфигурации.

  • полезно для перестроения схем репликации.

Поддержка ограничений при хранении WAL сегментов при использовании слотов репликации.

Параметр wal_keep_segments переименован в wal_keep_size.

Добавлена функция gen_random_uuid() для генерации UUIDv4.

Итого

  • производительность mixed read/write нагрузки за счет дедупликации в индексах
  • производительность запросов с участием партиционированных таблиц
  • расширение функциональности extended статистики
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment