Требуется ли REINDEX после CLUSTER?

12

Я рассматриваю возможность использования CLUSTER для изменения порядка таблицы по индексу. Я понимаю, что такое воссоздание данных таблицы делает все существующие индексы либо раздутыми, либо бесполезными. Я видел некоторые признаки того, что после кластера требуется REINDEX. Я нашел другие ссылки, которые указывают, что CLUSTER делает REINDEX. Официальная документация ничего не говорит вообще о REINDEX быть частью кластера или требуется (Хотя это предложить работает ПРОАНАЛИЗИРУЙТЕ после Кластера)

Может ли кто-нибудь окончательно (т.е. с какой-то ссылкой на официальные документы) сказать, требуется ли REINDEX после CLUSTER?

ДЕРЕВО
источник
2
Я не думаю, что это необходимо. clusterперемещает строки, поэтому ему придется обновлять информацию индекса в любом случае.
a_horse_with_no_name
Да, но теория в половине обсуждений, которые я обнаружил, заключается в том, что это приводит к раздутию индекса.
ДЕРЕВО

Ответы:

12

Вам не нужно переиндексировать, потому что CLUSTERэффективно делает это за вас.

Более конкретно, CLUSTERблокирует исходную таблицу, а затем создает новую ее копию, упорядоченную в соответствии с целевым индексом. Он создает индексы для новой копии, а затем заменяет старую таблицу и индексы новыми.

Обратите внимание, что это также верно VACUUM FULLв 9.0+.

Если вы видели обсуждение, предполагающее, что CLUSTERиндексы раздуты, это могут быть люди, которые полагают, что это CLUSTERработает как до 9.0 VACUUM FULL. Возможно, вы также видите и неправильно читаете обсуждения, в которых упоминается раздувание индекса, вызванное старой VACUUM FULLреализацией, и предложение CLUSTERв качестве альтернативы .

Это подразумевается в документации :

создается временная копия таблицы, которая содержит данные таблицы в порядке индекса. Временные копии каждого индекса в таблице также создаются . Следовательно, вам необходимо свободное место на диске, равное сумме размера таблицы и размеров индекса.

То, что это не говорит, но должно, - то, что те временные копии тогда заменяют оригинальную таблицу . (Жирный мой).

Крейг Рингер
источник
1
Есть ли у вас какие-либо ссылки на то, что CLUSTER заменяет индексы?
ДЕРЕВО
1
@TREE Добавлено. Документы явно не говорят вам, что временная таблица и индексы заменяют оригиналы, но вы увидите, что это так, если вы действительно посмотрите на каталог данных до / после CLUSTER или изучите исходный код.
Крейг Рингер,
Я проверил это, и по крайней мере в моем тестовом сценарии размер файла индекса был уменьшен. Но это только один сценарий, и может быть много переменных, которые влияют на поведение (количество индексов, общий размер на диске и т. Д.), Поэтому я не могу доверять простому тесту.
TREE
1
@TREE Для полной уверенности в понимании поведения при всех возможных обстоятельствах вам необходимо прочитать исходный код. Все , что я могу вам сказать, что я не знаю о любой ситуации , в которой CLUSTERникак не перепишут индексы, и экспертизы фактических файлов base/ясно покажут новые relfilenodeс. Кажется, вы беспокоитесь о проблемах, которых у вас пока нет.
Крейг Рингер
8

У меня есть a_horse_with_no_name: вам не нужно пересоздавать индексы. Помимо того, что CLUSTERдокументация не упоминает об этом, мы также можем дополнительно просмотреть REINDEXстраницу:

Существует несколько сценариев использования REINDEX:

  • Индекс поврежден и больше не содержит действительных данных. Хотя в теории это никогда не должно происходить, на практике индексы могут быть повреждены из-за программных ошибок или аппаратных сбоев. REINDEX предоставляет метод восстановления.

  • Индекс стал «раздутым», так как он содержит много пустых или почти пустых страниц. Это может происходить с индексами B-дерева в PostgreSQL при определенных необычных шаблонах доступа. REINDEX предоставляет способ уменьшить потребление пространства индекса, написав новую версию индекса без мертвых страниц. См. Раздел 23.2 для получения дополнительной информации.

  • Вы изменили параметр хранения (например, fillfactor) для индекса и хотите убедиться, что изменение вступило в силу в полном объеме.

  • Сбой построения индекса с параметром CONCURRENTLY, в результате чего индекс "недействителен". Такие индексы бесполезны, но может быть удобно использовать REINDEX для их перестройки. Обратите внимание, что REINDEX не будет выполнять одновременную сборку. Чтобы создать индекс, не мешая производству, вы должны удалить его и еще раз ввести команду CREATE INDEX CONCURRENTLY.

Понятно, CLUSTERне попадает ни в один из этих случаев.

И в документах есть небольшое предложение CLUSTER:

[при кластеризации] Также создаются временные копии каждого индекса в таблице.

Это говорит о том, что, как и сама таблица, индексы также переупорядочиваются во время процесса - таким образом, повторная индексация становится бесполезной.

Dezso
источник
Предложение, безусловно, есть, и тестирование, кажется, подтверждает это. Я бы чувствовал себя лучше, полагаясь на такое поведение, если бы в документах говорилось, что индексы были воссозданы (навсегда).
ДЕРЕВО
2
Я вижу материал для патча здесь. Руководство должно быть более явным о воссоздании индексов.
Эрвин Брандштеттер,
На данный момент я подозреваю, что разработчики не хотят официально документировать это поведение, потому что они не хотят быть постоянно привязанными к этой реализации.
TREE
@TREE есть много изменений в функциях между версиями и изменениями документов (в основном) соответственно. Предположительно меняются и спецификации :), поэтому я нигде не вижу связи.
Дезсо
@dezso Верно, но они не захотят удалять документированные функции. Учитывая качество документации в целом, я все же предполагаю, что упущение такого поведения является преднамеренным.
TREE
5

Нашел ссылку, в разделе Восстановление дискового пространства .

Если у вас есть такая таблица и вам нужно освободить занимаемое ею избыточное дисковое пространство, вам нужно будет использовать VACUUM FULL или, альтернативно, CLUSTER или один из вариантов перезаписи таблицы ALTER TABLE. Эти команды переписывают новую копию таблицы и строят для нее новые индексы .

ДЕРЕВО
источник
-3

Анализируя все ответы, на мой взгляд, правильный способ сделать это - переиндексировать ПЕРЕД кластером. Поскольку в документации не указано, выполняет ли кластер переиндексацию или нет, а только копия индекса, упорядоченная или нет, я думаю, что индексированный индекс приведет к лучшей кластеризованной таблице. После этого анализ завершит работу. Полный вакуум, прежде всего, кажется бесполезным, если только кластер и / или переиндекс не освобождают мертвые кортежи

Айслан Луис Вендлинг
источник
Как уже говорилось в принятом ответе, документация действительно говорят , что индексы будут восстановлены, но только не на странице о команде CLUSTER.
ДЕРЕВО
А как CLUSTERи VACUUM FULLпроизводит совершенно новый физический стол - там просто не может быть мертвым после него. Пространство, используемое старой копией, будет освобождено к концу операции.
Dezso
В самом деле. Он воссоздает таблицу и все индексы. Но у меня есть сомнения по поводу индекса, который кластер использует для переупорядочения таблицы. Сначала он будет переиндексирован или будет использоваться для переупорядочения таблицы как есть? И после этого индекс воссоздается? Потому что проблемный индекс может вызвать некоторые проблемы ...
Aislan Luiz Wendling