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.