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

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

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

  • При изменении не затрагиваются столбцы, задействованные в индексах таблицы (в том числе, в индексах по выражениям и частичных индексах).

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

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

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

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

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