69.7. Кортежи только в куче (Heap-Only Tuples, HOT)
Для обеспечения высокой степени параллельности PostgreSQL сохраняет строки, реализуя многоверсионное управление конкурентным доступом (MVCC). Однако механизм MVCC работает не очень эффективно, когда происходит изменение данных. В частности, при изменении строк в таблицы должны добавляться их новые версии. Кроме того, для каждой изменённой строки в индексы должны добавляться новые элементы, а удаление старых версий строк и элементов индекса может повлечь дополнительные издержки.
Для снижения издержек, связанных с изменениями данных, в PostgreSQL реализована оптимизация, называемая «кортежи только в куче» (HOT). Её применение возможно в следующих условиях:
При изменении не затрагиваются столбцы, задействованные в индексах таблицы (в том числе, в индексах по выражениям и частичных индексах).
На странице, содержащей старую версию строки, достаточно свободного места для новой.
При выполнении этих условий оптимизация HOT даёт два преимущества:
Для представления изменённых строк не нужны новые элементы индекса.
Старые версии изменённых строк могут быть полностью удалены в ходе обычной работы, даже во время
SELECT
, для этого не нужно периодически выполнять операции очистки. (Это возможно, поскольку индексы не ссылаются на идентификаторы элементов страниц.)
Таким образом, изменение кортежей только в куче может выполняться, только если не изменяются столбцы, задействованные в индексах. Чтобы на страницах было достаточно места для HOT-кортежей, можно уменьшить фактор заполнения
таблицы. Даже если это не делать, механизм HOT всё равно будет работать, поскольку новые строки будут естественным образом переноситься на новые страницы и существующие страницы, где достаточно свободного места для новых версий строк. За изменениями в режиме HOT и в обычном режиме позволяет наблюдать системное представление pg_stat_all_tables.