Как найти фрагментированные индексы и дефрагментировать их в PostgreSQL? - PullRequest
0 голосов
/ 21 сентября 2018

Я нашел, как мы можем решить эту проблему в SQL Server здесь - но как я могу сделать это в PostgreSQL?

Ответы [ 2 ]

0 голосов
/ 21 сентября 2018

Обычно вам вообще не нужно об этом беспокоиться.

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

Инструмент для определения этого идентификатора расширения pgstattuple:

CREATE EXTENSION pgstattuple;

Затем вы можете исследовать индексный расклад следующим образом:

SELECT * FROM pgstatindex('spatial_ref_sys_pkey');

-[ RECORD 1 ]------+-------
version            | 2
tree_level         | 1
index_size         | 196608
root_block_no      | 3
internal_pages     | 1
leaf_pages         | 22
empty_pages        | 0
deleted_pages      | 0
avg_leaf_density   | 64.48
leaf_fragmentation | 13.64

Этот индекс находится в отличной форме (никогда не использовался): он имеет только 14% размаха.

Помните, что индексы по умолчанию создаются с fillfactor, равным 90, то есть блоки индексане заполнены более чем на 90% к INSERT.

Трудно сказать, когда индекс раздут, но если leaf_fragmentation превышает 50-60, это не так красиво.

Чтобы реорганизовать индекс, используйте REINDEX.

0 голосов
/ 21 сентября 2018

При использовании дефрагментации индекса PostgreSQL, как правило, демон Autovacuum должен обрабатывать автоматически.Если вы не используете демон autovacuum или не можете его поддерживать, вы всегда можете переиндексировать проблемные индексы .

Определение того, какие индексы могут быть сильно фрагментированы, не являетсяособенно прямолинейно и подробно обсуждается в этом посте и в этой вики-статье PostgreSQL .

...