Одно объяснение может быть ГОРЯЧИЕ обновления .
Если в блоке таблицы есть место и обновленный столбец не проиндексирован, PostgreSQL поместит новую версию строки в тот же блок, что и оригинал, и создаст & ldquo; цепочку HOT & rdquo; где старая версия строки указывает на новую. Это позволяет PostgreSQL пропускать обновление всех индексов, которые указывают на эту строку таблицы.
Помимо уменьшения количества операций ввода-вывода во время UPDATE
, HOT также позволяет удалять старые версии строк & ldquo; на лету & rdquo;: при каждом посещении страницы, которая почти заполнена и может быть получена необходимая блокировка, PostgreSQL будет выполнять & ldquo; микро-вакуум & rdquo; на этом блоке путем его реорганизации.
Это то, что может вызвать наблюдаемое сокращение кортежей.
Чтобы поддержать или опровергнуть эту теорию, выполните следующий запрос:
SELECT n_tup_upd, n_tup_hot_upd
FROM pg_stat_user_tables
WHERE schemaname = 'public' AND relname = 'ad_session_status';
Если n_tup_hot_upd
больше нуля, у нас есть дело.