REINDEX

Перестроение индекса.

Синтаксис

REINDEX {INDEX | TABLE | DATABASE | SYSTEM} name

Описание

Команда REINDEX перестраивает индекс, используя данные, хранящиеся в таблице индекса, и заменяет старую копию индекса. Команда REINDEX может использоваться в следующих случаях:

  • Индекс раздут, то есть содержит множество пустых или почти пустых страниц. Это может происходить при определённых редких режимах доступа. B-tree индексы в базах данных YMatrix. REINDEX позволяет уменьшить потребление дискового пространства индексами за счёт создания новых версий индексов без мёртвых страниц.
  • Вы изменили параметры хранения FILLFACTOR индекса и хотите убедиться, что изменения полностью применены.

Параметры

INDEX

  • Пересоздать указанный индекс.

TABLE

  • Пересоздать все индексы указанной таблицы. Если у таблицы имеется вспомогательная TOAST-таблица, она также будет перепроиндексирована.

DATABASE

  • Пересоздать все индексы в текущей базе данных. Будут обработаны также индексы на общих системных каталогах. Эта форма команды REINDEX не может выполняться внутри блока транзакции.

SYSTEM

  • Пересоздать все индексы системных каталогов в текущей базе данных. Включает индексы на общих системных каталогах. Индексы пользовательских таблиц не обрабатываются. Эта форма команды REINDEX не может выполняться внутри блока транзакции.

name

  • Имя конкретного индекса, таблицы или базы данных, которые необходимо перепроиндексировать. Имена индексов и таблиц могут быть указаны с указанием схемы. В настоящее время REINDEX DATABASE и REINDEX SYSTEM могут перепроиндексировать только текущую базу данных, поэтому их параметр должен совпадать с именем текущей базы данных.

Замечания

REINDEX по своему эффекту аналогичен удалению и повторному созданию индекса, поскольку содержимое индекса перестраивается заново. Однако меры по блокировкам существенно различаются. REINDEX блокирует запись в родительскую таблицу индекса, но не блокирует чтение. Также он устанавливает исключительную блокировку на конкретный обрабатываемый индекс, что блокирует чтение через этот индекс. Напротив, DROP INDEX немедленно накладывает исключительную блокировку на родительскую таблицу, тем самым запрещая как запись, так и чтение. Последующая команда CREATE INDEX блокирует запись, но не блокирует чтение; поскольку индекс отсутствует, попыток чтения не происходит, что означает отсутствие блокировок, однако операции чтения могут вынужденно выполнять дорогостоящее последовательное сканирование.

Для перестроения одного индекса или таблицы необходимо быть владельцем этого индекса или таблицы. Для перестроения индексов всей базы данных необходимо быть владельцем базы данных (обратите внимание, что владелец базы данных может перестраивать индексы таблиц, принадлежащих другим пользователям).

REINDEX не обновляет статистику reltuples и relpages для индексов. Чтобы обновить эти значения, выполните команду ANALYZE для таблицы после перестроения индекса.

Если вы подозреваете, что индексы общих глобальных системных каталогов повреждены, вы можете перестроить их только в утилитарном режиме YMatrix. Типичным признаком повреждения общего индекса является ошибка «index is not btree»; в противном случае сервер может аварийно завершить работу при запуске из-за использования повреждённого индекса. В этом случае обратитесь в службу поддержки YMatrix: [email protected].

Пример

Перестроить один индекс:

REINDEX INDEX my_index;

Перестроить все индексы таблицы my_table:

REINDEX TABLE my_table;

Совместимость

Команда REINDEX отсутствует в стандарте SQL.