Реиндексация базы sql: DBCC DBREINDEX (Transact-SQL) — SQL Server

PostgreSQL : Документация: 9.6: reindexdb : Компания Postgres Professional

RU

EN

RU EN

reindexdb

reindexdb — переиндексировать базу данных PostgreSQL

Синтаксис

reindexdb [параметр-подключения…] [параметр…] [ -S | --schema схема ] … [ -t | --table таблица ] … [ -i | --index индекс ] … [имя_бд]

reindexdb [параметр-подключения…] [параметр…] -a | --all

reindexdb [параметр-подключения…] [параметр…] -s | --system [имя_бд]

Описание

Утилита reindexdb предназначена для перестроения индексов в базе данных PostgreSQL.

Утилита reindexdb представляет собой обёртку SQL-команды REINDEX. Переиндексация базы данных с её помощью по сути не отличается от переиндексации при обращении к серверу другими способами.

Параметры

reindexdb принимает следующие аргументы командной строки:

-a
--all

Переиндексировать все базы данных.

[-d] имя_бд
[--dbname=]имя_бд

Указывает имя базы данных для переиндексации, когда не используется параметр -a/--all. Если это указание отсутствует, имя базы определяется переменной окружения PGDATABASE. Если эта переменная не установлена, именем базы будет имя пользователя, указанное для подключения. В аргументе имя_бд может задаваться строка подключения. В этом случае параметры в строке подключения переопределяют одноимённые параметры, заданные в командной строке.

-e
--echo

Выводить команды, которые reindexdb генерирует и передаёт серверу.

-i индекс
--index=индекс

Пересоздать только указанный индекс. Добавив дополнительные ключи -i, можно пересоздать несколько индексов.

-q
--quiet

Подавлять вывод сообщений о прогрессе выполнения.

-s
--system

Переиндексировать только системные каталоги базы данных.

-S схема
--schema=схема

Переиндексировать только указанную схему. Переиндексировать несколько схем можно, добавив несколько ключей -S.

-t таблица
--table=таблица

Переиндексировать только указанную таблицу. Переиндексировать несколько таблиц можно, добавив несколько ключей -t.

-v
--verbose

Вывести подробную информацию во время процесса.

-V
--version

Сообщить версию reindexdb и завершиться.

-?
--help

Показать справку по аргументам командной строки reindexdb и завершиться.

Утилита reindexdb также принимает следующие аргументы командной строки в качестве параметров подключения:

-h сервер
--host=сервер

Указывает имя компьютера, на котором работает сервер. Если значение начинается с косой черты, оно определяет каталог Unix-сокета.

-p порт
--port=порт

Указывает TCP-порт или расширение файла локального Unix-сокета, через который сервер принимает подключения.

-U имя_пользователя
--username=имя_пользователя

Имя пользователя, под которым производится подключение.

-w
--no-password

Не выдавать запрос на ввод пароля. Если сервер требует аутентификацию по паролю и пароль не доступен с помощью других средств, таких как файл .pgpass, попытка соединения не удастся. Этот параметр может быть полезен в пакетных заданиях и скриптах, где нет пользователя, который вводит пароль.

-W
--password

Принудительно запрашивать пароль перед подключением к базе данных.

Это несущественный параметр, так как reindexdb запрашивает пароль автоматически, если сервер проверяет подлинность по паролю. Однако чтобы понять это, reindexdb лишний раз подключается к серверу. Поэтому иногда имеет смысл ввести -W, чтобы исключить эту ненужную попытку подключения.

--maintenance-db=имя_бд

Указывает имя базы данных, к которой будет выполняться подключение для определения подлежащих переиндексации баз данных, когда используется ключ -a/--all. Если это имя не указано, будет выбрана база postgres, а если она не существует — template1. В данном аргументе может задаваться строка подключения. В этом случае параметры в строке подключения переопределяют одноимённые параметры, заданные в командной строке. Кроме того, все параметры в строке подключения, за исключением имени базы, будут использоваться и при подключении к другим базам данных.

Переменные окружения

PGDATABASE
PGHOST
PGPORT
PGUSER

Параметры подключения по умолчанию

Эта утилита, как и большинство других утилит PostgreSQL, также использует переменные среды, поддерживаемые libpq (см. Раздел 32.14).

Диагностика

В случае возникновения трудностей, обратитесь к описаниям REINDEX и psql, где обсуждаются потенциальные проблемы и сообщения об ошибках. Учтите, что на целевом компьютере должен работать сервер баз данных. При этом применяются все свойства подключения по умолчанию и переменные окружения, которые использует клиентская библиотека libpq.

Замечания

Утилите reindexdb может потребоваться подключаться к серверу PostgreSQL несколько раз, и при этом она будет каждый раз запрашивать пароль. В таких случаях удобно иметь файл ~/.pgpass. За дополнительными сведениями обратитесь к Разделу 32.15.

Примеры

Переиндексирование базы данных test:

$ reindexdb test

Переиндексирование таблицы foo и индекса bar в базе данных abcd:

$ reindexdb --table foo --index bar abcd

См. также

REINDEX

PostgreSQL : Документация: 10: REINDEX : Компания Postgres Professional

RU

EN

RU EN

REINDEX

REINDEX — перестроить индексы

Синтаксис

REINDEX [ ( VERBOSE ) ] { INDEX | TABLE | SCHEMA | DATABASE | SYSTEM } имя

Описание

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

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

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

  • Параметр хранения индекса (например, фактор заполнения) был изменён, и теперь требуется, чтобы это изменение вступило в силу в полной мере.

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

Параметры

INDEX

Перестраивает указанный индекс.

TABLE

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

SCHEMA

Перестраивает все индексы в указанной схеме. Если таблица в этой схеме имеет вторичную таблицу «TOAST», она также будет переиндексирована. При этом обрабатываются и индексы в общих системных каталогах. Эту форму REINDEX нельзя выполнить в блоке транзакции.

DATABASE

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

SYSTEM

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

имя

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

VERBOSE

Выводит отчёт о прогрессе после переиндексации каждого индекса.

Замечания

В случае подозрений в повреждении индекса таблицы пользователя, этот индекс или все индексы таблицы можно перестроить, используя команду REINDEX INDEX или REINDEX TABLE.

Всё усложняется, если возникает необходимость восстановить повреждённый индекс системной таблицы. В этом случае важно, чтобы система сама не использовала этот индекс. (На самом деле в таких случаях вы, скорее всего, столкнётесь с падением процессов сервера в момент запуска, как раз вследствие испорченных индексов.) Чтобы надёжно восстановить рабочее состояние, сервер следует запускать с параметром -P, который отключает использование индексов при поиске в системных каталогах.

Один из вариантов сделать это — выключить сервер PostgreSQL и запустить его снова в однопользовательском режиме, с параметром -P в командной строке. Затем можно выполнить REINDEX DATABASE, REINDEX SYSTEM, REINDEX TABLE или REINDEX INDEX, в зависимости от того, что вы хотите восстановить. В случае сомнений выполните REINDEX SYSTEM, чтобы перестроить все системные индексы в базе данных. Затем завершите однопользовательский сеанс сервера и перезапустите сервер в обычном режиме. Чтобы подробнее узнать, как работать с сервером в однопользовательском интерфейсе, обратитесь к справочной странице postgres.

Можно так же запустить обычный экземпляр сервера, но добавить в параметры командной строки -P. В разных клиентах это может делаться по-разному, но во всех клиентах на базе libpq можно установить для переменной окружения PGOPTIONS значение -P до запуска клиента. Учтите, что хотя этот метод не препятствует работе других клиентов, всё же имеет смысл не позволять им подключаться к повреждённой базе данных до завершения восстановления.

Действие REINDEX подобно удалению и пересозданию индекса в том смысле, что содержимое индекса пересоздаётся с нуля, но блокировки при этом устанавливаются другие. REINDEX блокирует запись, но не чтение родительской таблицы индекса. Эта команда также устанавливает блокировку ACCESS EXCLUSIVE для обрабатываемого индекса, что блокирует чтение таблицы, при котором задействуется этот индекс. DROP INDEX, напротив, моментально устанавливает блокировку ACCESS EXCLUSIVE на родительскую таблицу, блокируя и запись, и чтение. Последующая команда CREATE INDEX блокирует запись, но не чтение; так как индекс отсутствует, обращений к нему ни при каком чтении не будет, что означает, что блокироваться чтение не будет, но выполняться оно будет как дорогостоящее последовательное сканирование.

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

Примеры

Перестроение одного индекса:

REINDEX INDEX my_index;

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

REINDEX TABLE my_table;

Перестроение всех индексов в определённой базе данных, в предположении, что целостность системных индексов под сомнением:

$ export PGOPTIONS="-P"
$ psql broken_db
. ..
broken_db=> REINDEX DATABASE broken_db;
broken_db=> \q

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

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

Как переиндексировать таблицы SQL | Малый бизнес

Джон Папевски

Индексы в таблицах большой базы данных имеют огромное значение в ее производительности и полезности. Без индекса поиск одной записи в большой таблице может занять несколько секунд; с индексом поиск записей занимает доли секунды. Для таблиц, которые часто добавляются, удаляются и изменяются, индексы могут становиться фрагментированными и неорганизованными, что снижает производительность. Переиндексация таблиц — важная часть правильного обслуживания базы данных, поскольку она реорганизует индексы и восстанавливает быстрый доступ. Microsoft SQL Server имеет удобную команду, которая перестраивает все индексы в таблице. Пользователи Oracle обычно перестраивают каждый индекс в таблице отдельно.

Microsoft SQL Server

  1. Запустите SQL Server Management Studio. Программа Management Studio запустится и отобразит диалоговое окно «Подключиться к серверу».

  2. Щелкните запись сервера в списке, отображаемом в диалоговом окне. Небольшие организации имеют только один сервер; более крупные компании могут иметь несколько.

  3. Нажмите «Аутентификация Windows» в раскрывающемся списке «Аутентификация» в диалоговом окне. Нажмите кнопку «Подключить».

  4. Нажмите «Новый запрос» на панели инструментов Management Studio, чтобы открыть текстовый редактор для операторов SQL.

  5. Введите команды в текстовую область, руководствуясь следующими операторами:

    USE имя_базы_данных DBCC DBREINDEX имя_таблицы

    Оператор USE выбирает и открывает базу данных на сервере; используйте имя вашей базы данных вместо «database_name». Оператор DBCC DBREINDEX перестраивает все индексы в таблице; замените имя вашей таблицы на «table_name». Например, ваши команды могут выглядеть следующим образом:

    USE-заказы DBCC DBREINDEX products

  6. Нажмите кнопку «Выполнить» на панели инструментов Management Studio, которая выглядит как направленный вправо зеленый треугольник, чтобы выполнить код SQL и просмотреть результаты в отдельной области под код.

Oracle

  1. Запустите SQL Plus на своем компьютере. Утилита SQL Plus показывает следующую подсказку:

    SQL>

  2. Подключитесь к базе данных Oracle, введя команду «connect» следующим образом:

    подключиться user_id@database_identifier

    Нажмите «Ввод». Замените имя пользователя вашей базы данных на «user_id» и замените конкретную базу данных Oracle на «database_identifier». SQL*Plus запросит у вас пароль. Введите пароль и снова нажмите «Enter».

  3. Введите команду Oracle «ALTER INDEX», используя в качестве примера следующий код:

    ALTER INDEX table_index_ix REBUILD PARALLEL;

    Вместо «table_index_ix» используйте имя индекса, который вы хотите перестроить. Ключевое слово «PARALLEL» указывает Oracle сделать переиндексацию как можно быстрее, используя параллельную обработку. Обратите внимание, что оператор «ALTER INDEX» перестраивает один индекс за раз; если таблица имеет несколько индексов, вам нужно «ALTER INDEX» для каждого из них.

  4. Нажмите «Ввод», чтобы выполнить команду.

Ссылки

  • Microsoft MSDN: DBCC DBREINDEX
  • Oracle: ALTER INDEX

Советы

  • Для больших таблиц переиндексация потребляет значительные вычислительные ресурсы. Запланируйте переиндексацию в периоды низкой активности, например, поздним вечером или в выходные дни, если это возможно.

Биография писателя

Уроженец Чикаго Джон Папевски имеет степень по физике и пишет с 19 лет.91. Он внес свой вклад в «Foresight Update», информационный бюллетень по нанотехнологиям от Института Foresight. Он также внес свой вклад в книгу «Нанотехнологии: молекулярные размышления о глобальном изобилии».

PostgreSQL: Документация: 15: REINDEX

Описание

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

  • .

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

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

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

  • Если построение индекса завершается ошибкой с параметром CONCURRENTLY , этот индекс остается «недействительным». Такие индексы бесполезны, но может быть удобно использовать REINDEX для их перестроения. Обратите внимание, что только REINDEX INDEX может выполнять параллельную сборку по недопустимому индексу.

Параметры

ИНДЕКС

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

СТОЛ

Повторно создать все индексы указанной таблицы. Если у таблицы есть вторичная таблица «TOAST», она также переиндексируется. Эта форма REINDEX не может выполняться внутри блока транзакций при использовании с многораздельной таблицей.

СХЕМА

Повторно создать все индексы указанной схемы. Если у таблицы этой схемы есть вторичная таблица «TOAST», она также переиндексируется. Также обрабатываются индексы общих системных каталогов. Эта форма REINDEX не может выполняться внутри блока транзакции.

БАЗА ДАННЫХ

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

СИСТЕМА

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

имя

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

СОВМЕСТНО

При использовании этого параметра PostgreSQL перестроит индекс без каких-либо блокировок, препятствующих одновременным вставкам, обновлениям или удалениям в таблице; тогда как стандартное перестроение индекса блокирует запись (но не чтение) в таблицу до тех пор, пока это не будет сделано. Есть несколько предостережений, о которых следует помнить при использовании этого параметра — см. раздел «Параллельное перестроение индексов» ниже.

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

ТАБЛИЧНОЕ ПРОСТРАНСТВО

Указывает, что индексы будут перестроены в новом табличном пространстве.

ПОДРОБНАЯ ИНФОРМАЦИЯ

Печатает отчет о ходе переиндексации каждого индекса.

логический

Указывает, должен ли выбранный параметр быть включен или выключен. Вы можете написать TRUE , ON или 1 для включения опции и FALSE , OFF или 0 для ее отключения. Булево значение также может быть опущено, и в этом случае предполагается TRUE .

новое_табличное пространство

Табличное пространство, в котором будут перестроены индексы.

Примечания

Если вы подозреваете повреждение индекса в пользовательской таблице, вы можете просто перестроить этот индекс или все индексы в таблице, используя ИНДЕКС ПЕРЕИНДЕКС или ТАБЛИЦА ПЕРЕИНДЕКС .

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

Один из способов сделать это — выключить сервер и запустить однопользовательский сервер PostgreSQL с параметром -P , включенным в его командную строку. Затем можно выдать REINDEX DATABASE , REINDEX SYSTEM , REINDEX TABLE или REINDEX INDEX , в зависимости от того, сколько вы хотите реконструировать. Если вы сомневаетесь, используйте REINDEX SYSTEM , чтобы выбрать реконструкцию всех системных индексов в базе данных. Затем завершите сеанс однопользовательского сервера и перезапустите обычный сервер. См. справочную страницу postgres для получения дополнительной информации о том, как взаимодействовать с однопользовательским серверным интерфейсом.

В качестве альтернативы можно запустить обычный сеанс сервера, указав -P в параметрах командной строки. Способ выполнения этого зависит от клиента, но во всех клиентах на основе libpq можно перед запуском клиента установить для переменной среды PGOPTIONS значение -P . Обратите внимание, что хотя этот метод не требует блокировки других клиентов, все же может быть разумным запретить другим пользователям подключаться к поврежденной базе данных до тех пор, пока ремонт не будет завершен.

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

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

Переиндексация секционированных индексов или секционированных таблиц поддерживается параметрами REINDEX INDEX или REINDEX TABLE соответственно. Каждая секция указанного секционированного отношения переиндексируется в отдельной транзакции. Эти команды нельзя использовать внутри блока транзакций при работе с секционированной таблицей или индексом.

При использовании предложения TABLESPACE с REINDEX для многораздельного индекса или таблицы обновляются только ссылки на табличные пространства конечных разделов. Поскольку секционированные индексы не обновляются, рекомендуется отдельно использовать ALTER TABLE ONLY на них, чтобы любые новые присоединенные разделы наследовали новое табличное пространство. В случае сбоя он может не переместить все индексы в новое табличное пространство. Повторный запуск команды перестроит все конечные разделы и переместит ранее необработанные индексы в новое табличное пространство.

Если SCHEMA , DATABASE или SYSTEM используется с TABLESPACE , системные отношения пропускаются и будет сгенерировано одно WARNING . Индексы в таблицах TOAST перестраиваются, но не перемещаются в новое табличное пространство.

Одновременное перестроение индексов

Перестроение индекса может помешать нормальной работе базы данных. Обычно PostgreSQL блокирует таблицу, индекс которой перестраивается, от записи и выполняет построение всего индекса за одно сканирование таблицы. Другие транзакции все еще могут читать таблицу, но если они попытаются вставить, обновить или удалить строки в таблице, они будут заблокированы до завершения перестроения индекса. Это может иметь серьезные последствия, если система представляет собой рабочую базу данных. Для индексации очень больших таблиц может потребоваться много часов, и даже для небольших таблиц перестроение индекса может блокировать записи на периоды, неприемлемо длительные для производственной системы.

PostgreSQL поддерживает перестроение индексов с минимальной блокировкой записи. Этот метод вызывается указанием параметра CONCURRENTLY параметра REINDEX . При использовании этой опции PostgreSQL должен выполнить два сканирования таблицы для каждого индекса, который необходимо перестроить, и дождаться завершения всех существующих транзакций, которые потенциально могут использовать этот индекс. Этот метод требует больше общей работы, чем стандартное перестроение индекса, и занимает значительно больше времени, так как необходимо ждать незавершенных транзакций, которые могут изменить индекс. Однако, поскольку он позволяет продолжать обычные операции во время перестроения индекса, этот метод полезен для перестроения индексов в производственной среде. Конечно, дополнительная нагрузка на ЦП, память и ввод-вывод, вызванная перестроением индекса, может замедлить выполнение других операций.

При одновременном переиндексировании выполняются следующие шаги. Каждый шаг выполняется в отдельной транзакции. Если необходимо перестроить несколько индексов, то каждый шаг перебирает все индексы перед переходом к следующему шагу.

  1. В каталог pg_index добавлено новое определение временного индекса. Это определение будет использоваться для замены старого индекса. Блокировка SHARE UPDATE EXCLUSIVE на уровне сеанса применяется к переиндексируемым индексам, а также к связанным с ними таблицам, чтобы предотвратить любое изменение схемы во время обработки.

  2. Первый проход для построения индекса выполняется для каждого нового индекса. После построения индекса его флаг pg_index.indisready переключается на «true», чтобы сделать его готовым к вставкам, делая его видимым для других сеансов после завершения транзакции, выполнившей построение. Этот шаг выполняется в отдельной транзакции для каждого индекса.

  3. Затем выполняется второй проход для добавления кортежей, которые были добавлены во время выполнения первого прохода. Этот шаг также выполняется в отдельной транзакции для каждого индекса.

  4. Все ограничения, относящиеся к индексу, изменены, чтобы ссылаться на новое определение индекса, и изменены имена индексов. В этот момент pg_index.indisvalid переключается на «true» для нового индекса и на «false» для старого, и выполняется инвалидация кеша, в результате чего все сеансы, которые ссылались на старый индекс, становятся недействительными.

  5. Старые индексы имеют pg_index.indisready переключено на «false», чтобы предотвратить вставку новых кортежей после ожидания завершения выполнения запросов, которые могут ссылаться на старый индекс.

  6. Старые индексы удалены. Сеансовые блокировки ОБНОВЛЕНИЯ ЭКСКЛЮЗИВНОГО ОБНОВЛЕНИЯ для индексов и таблицы сняты.

Если при перестроении индексов возникает проблема, например нарушение уникальности в уникальном индексе, Команда REINDEX завершится ошибкой, но оставит «недопустимый» новый индекс в дополнение к ранее существовавшему. Этот индекс будет проигнорирован для запросов, поскольку он может быть неполным; однако он по-прежнему будет потреблять накладные расходы на обновление. Команда psql \d сообщит о таком индексе как INVALID :

.
postgres=# \d вкладка
       Таблица "public.tab"
 Колонка | Тип | Модификаторы
--------+---------+-----------
 кол | целое число |
Индексы:
    "idx" btree (столбец)
    "idx_ccnew" btree (столбец) INVALID
 

Если индекс с пометкой INVALID имеет суффикс ccnew , то он соответствует временному индексу, созданному во время параллельной операции, и рекомендуемым методом восстановления является его удаление с помощью DROP INDEX , а затем повторная попытка REINDEX CONCURRENTLY . Если недопустимый индекс имеет суффикс ccold , он соответствует исходному индексу, который нельзя удалить; рекомендуемый метод восстановления — просто удалить указанный индекс, поскольку собственно перестроение прошло успешно.

Обычные построения индексов позволяют выполнять другие построения обычных индексов для одной и той же таблицы одновременно, но одновременно для таблицы может выполняться только одно параллельное построение индексов. В обоих случаях никакие другие типы модификации схемы в таблице не допускаются. Еще одно отличие заключается в том, что обычная команда REINDEX TABLE или REINDEX INDEX может быть выполнена внутри блока транзакции, а REINDEX CONCURRENTLY — нет.

Как и любая длительная транзакция, REINDEX для таблицы может повлиять на то, какие кортежи могут быть удалены параллельным VACUUM для любой другой таблицы.

REINDEX SYSTEM не поддерживает CONCURRENTLY , так как системные каталоги не могут быть переиндексированы одновременно.