Вновь созданный индекс - это по существу оптимально упакованные отсортированные данные. Чтобы разместить еще немного данных где-то посередине, сохраняя при этом оптимально упакованные отсортированные данные, вам придется перезаписывать половину индекса при каждой вставке в среднем.
Это неприемлемо, поэтому в базе данных используется какой-то сложный и умный формат для индексов (основанный на структуре данных b-дерева), который позволяет изменять порядок блоков индексов, не перемещая их на диск. Но следствием этого является то, что после вставки некоторых данных в середине некоторые из блоков данных индекса не упаковываются на 100%. Оставшееся пространство можно использовать в будущем, но только в том случае, если введенные значения соответствуют блоку в отношении порядка.
Таким образом, в зависимости от модели использования, вы можете легко иметь индексные блоки, упакованные только на 10%.
Это усугубляется тем фактом, что при обновлении строки в индексе должны одновременно присутствовать как старая, так и новая версия. И если вы выполните массовое обновление всей таблицы, тогда индекс придется расширить, чтобы он содержал вдвое больше строк, хотя и кратко. Но это не сократится так легко, поскольку это требует в основном переписывания всего этого.
Размер индекса сначала увеличивается, а затем стабилизируется после некоторого использования. Но стабильный размер часто не соответствует размеру вновь созданного.
Возможно, вы захотите настроить автовакуум на более агрессивный режим, поэтому больше не требуется места в таблице и индексах, и он восстанавливается быстрее и поэтому может быть использован повторно быстрее. Это может сделать ваш индекс стабилизироваться быстрее и меньше. Также старайтесь избегать слишком больших массовых обновлений или выполните vacuum full tablename
после огромного обновления.