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

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

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

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

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

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

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

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

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