65.7. Кортежи только в куче (Heap-Only Tuples, HOT) #

Для обеспечения высокой степени параллельности Postgres Pro сохраняет строки, реализуя многоверсионное управление конкурентным доступом (MVCC). Однако механизм MVCC работает не очень эффективно, когда происходит изменение данных. В частности, при изменении строк в таблицы должны добавляться их новые версии. Кроме того, для каждой изменённой строки в индексы должны добавляться новые элементы, а удаление старых версий строк и элементов индекса может повлечь дополнительные издержки.

Для снижения издержек, связанных с изменениями данных, в Postgres Pro реализована оптимизация, называемая «кортежи только в куче» (HOT). Её применение возможно в следующих условиях:

  • При изменении не меняются столбцы, на которые ссылаются индексы таблицы, за исключением индексов сводных данных. Единственный метод, определяющий поведение сводных значений в базовом дистрибутиве Postgres Pro, — BRIN.

  • На странице, содержащей старую версию строки, достаточно свободного места для новой.

При выполнении этих условий оптимизация HOT даёт два преимущества:

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

  • При многократном изменении строки её версии, кроме первой и последней, могут быть полностью удалены в ходе обычной работы, даже во время SELECT, для этого не нужно периодически выполнять операции очистки. (Индексы всегда ссылаются на идентификатор элемента страницы исходной версии строки. Данные кортежей, связанных с этой версией строки, удаляются, а её идентификатор элемента преобразуется в ссылку, указывающую на первую версию строки, которая может быть по-прежнему видна параллельной транзакции. Промежуточные версии строки, которые больше никому не видны, полностью удаляются, а связанные идентификаторы элементов страниц становятся доступны для повторного использования.)

Чтобы на страницах было достаточно места для HOT-кортежей, можно уменьшить fillfactor (фактор заполнения) таблицы. Даже если это не делать, механизм HOT всё равно будет работать, поскольку новые строки будут естественным образом переноситься на новые страницы и существующие страницы, где достаточно свободного места для новых версий строк. За изменениями в режиме HOT и в обычном режиме позволяет наблюдать системное представление pg_stat_all_tables.