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