Комментарии 2
При апдейте строки, если это возможно, Постгрес поставит новую копию строки сразу после старой копии строки. Плюс в старой копии строки проставляется специальная метка, для того чтобы Постгрес знал, что новая копия строки находится сразу после старой. Поэтому обновлять все индексы не нужно.
Что будет, если в процессе автовакуума будет удалена старая версия строки?
Старая версия строки будет удалена не полностью. Та часть, которая указывает на новую версию строки останется целой.
Теперь немного подробнее.
Строка в постгресе состоит из двух частей — указателя на то, где находится строка и самой строки. Индекс ссылается именно на указатель.
После того, как строку проапдейтят, для того, чтобы найти новую строку, нужно из индекса взять адрес указателя, потом с помощью указателя найти блок, где находится старая версия строки, понять, что она старая и перейти к новой.
После того, как пройдёт вакуум (это кстати не совсем вакуум, потому что он не трогает индексы) указатель, который раньше указывал на блок со старой версией строки, будет указывать на указатель, который указывает на блок с новой версией строки, а место, которое занимала старая версия строки, освободится.
Вот так оно происходит, если сократить и упростить.
Механизм Heap only tuples в PostgreSQL