Как происходит фрагментация в индексе? - PullRequest
0 голосов
/ 04 июля 2018

У меня была таблица 200 ГБ с индексом 49 ГБ. Только операция вставки и обновления происходит с этой таблицей. Я удалил существующий индекс и создал новый для тех же столбцов. Новый размер индекса составляет всего 6 ГБ. Я использую базу данных postgres

Может кто-нибудь объяснить, как уменьшился размер индекса с 50 ГБ до 6 ГБ?

1 Ответ

0 голосов
/ 05 июля 2018

Вновь созданный индекс - это по существу оптимально упакованные отсортированные данные. Чтобы разместить еще немного данных где-то посередине, сохраняя при этом оптимально упакованные отсортированные данные, вам придется перезаписывать половину индекса при каждой вставке в среднем.

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

Таким образом, в зависимости от модели использования, вы можете легко иметь индексные блоки, упакованные только на 10%.

Это усугубляется тем фактом, что при обновлении строки в индексе должны одновременно присутствовать как старая, так и новая версия. И если вы выполните массовое обновление всей таблицы, тогда индекс придется расширить, чтобы он содержал вдвое больше строк, хотя и кратко. Но это не сократится так легко, поскольку это требует в основном переписывания всего этого.

Размер индекса сначала увеличивается, а затем стабилизируется после некоторого использования. Но стабильный размер часто не соответствует размеру вновь созданного.

Возможно, вы захотите настроить автовакуум на более агрессивный режим, поэтому больше не требуется места в таблице и индексах, и он восстанавливается быстрее и поэтому может быть использован повторно быстрее. Это может сделать ваш индекс стабилизироваться быстрее и меньше. Также старайтесь избегать слишком больших массовых обновлений или выполните vacuum full tablename после огромного обновления.

...