6
HOT-обновление
Значения индексированных столбцов не должны изменяться
иначе придется добавить индексную запись, ссылающуюся на новую
версию строки, и версию нельзя будет пометить как «heap only»
Цепочка обновлений — только в пределах одной страницы
не требуется обращение к другим страницам,
обход цепочки не ухудшает производительность
если в табличной странице не хватает места для новой версии,
цепочка обрывается (как если бы оптимизация не работала)
место в странице можно зарезервировать, уменьшив параметр
хранения таблицы fillfactor (100 % → 10 %)
Подчеркнем, что HOT-обновления работают только в случае, если
не изменяется ни один ключ в индексах. Иначе в каком-либо индексе
появилась бы ссылка непосредственно на новую версию строки, что
противоречит идее этой оптимизации. Только упомянутый выше индекс
BRIN не препятствует HOT-обновлению (в нем нет ссылок на
табличные строки).
В том числе HOT-обновления применяются и к таблицам, на которых
нет вообще ни одного индекса: при обновлении любых полей такой
таблицы будет строиться цепочка версий.
Оптимизация действует только в пределах одной страницы, поэтому
дополнительный обход цепочки не требует обращения к другим
страницам и не ухудшает производительность.
Однако если на странице не хватит свободного места, чтобы
разместить новую версию строки, цепочка прервется. На версию
строки, размещенную на другой странице, придется сделать и ссылку
из индекса.
Поэтому при частых обновлениях неиндексированных полей может
иметь смысл уменьшить параметр хранения fillfactor. Этот параметр
определяет пороговый процент занятого на странице места, после
которого вставка новых строк в эту страницу будет запрещена.
Значение по умолчанию – 100%, можно уменьшать до 10%.
Оставшееся место резервируется для обновлений: в этом случае новая
версия строки может занять свободное место на той же странице.
(С другой стороны, чем выше fillfactor, тем компактнее располагаются
записи и, соответственно, размер таблицы получается меньше.)