PostgreSQL : Документация: 9.6: 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.
PostgreSQL : Документация: 12: REINDEX : Компания Postgres Professional
RU
EN
RU EN
REINDEX
REINDEX — перестроить индексы
Синтаксис
REINDEX [ ( VERBOSE ) ] { INDEX | TABLE | SCHEMA | DATABASE | SYSTEM } [ CONCURRENTLY ] имя
Описание
REINDEX
перестраивает индекс, обрабатывая данные таблицы, к которой относится индекс, и в результате заменяет старую копию индекса. Команда REINDEX
применяется в следующих ситуациях:
Индекс был повреждён, его содержимое стало некорректным. Хотя в теории этого не должно случаться, на практике индексы могут испортиться из-за программных ошибок или аппаратных сбоев. В таких случаях
REINDEX
служит методом восстановления индекса.Индекс стал «раздутым», то есть в нём оказалось много пустых или почти пустых страниц. Это может происходить с B-деревьями в PostgreSQL при определённых, достаточно редких сценариях использования.
REINDEX
даёт возможность сократить объём, занимаемый индексом, записывая новую версию индекса без «мёртвых» страниц. За подробностями обратитесь к Разделу 24.2.Параметр хранения индекса (например, фактор заполнения) был изменён, и теперь требуется, чтобы это изменение вступило в силу в полной мере.
Если построить индекс в режиме
CONCURRENTLY
не удаётся, индекс остаётся в «нерабочем» состоянии. Такие индексы бесполезны, но их можно легко перестроить, воспользовавшись командойREINDEX
. Однако заметьте, что перестраивать индекс в неблокирующем режиме может только командаREINDEX INDEX
.
Параметры
INDEX
Перестраивает указанный индекс.
TABLE
Перестраивает все индексы в указанной таблице. Если у таблицы имеется дополнительная таблица «TOAST», она так же переиндексируется.
SCHEMA
Перестраивает все индексы в указанной схеме. Если таблица в этой схеме имеет вторичную таблицу «TOAST», она также будет переиндексирована. При этом обрабатываются и индексы в общих системных каталогах. Эту форму
REINDEX
нельзя выполнить в блоке транзакции.DATABASE
Перестраивает все индексы в текущей базе данных. При этом обрабатываются также индексы в общих системных каталогах. Эту форму
REINDEX
нельзя выполнить в блоке транзакции.SYSTEM
Перестраивает все индексы в системных каталогах текущей базы данных. При этом обрабатываются также индексы в общих системных каталогах, но индексы в таблицах пользователя не затрагиваются. Эту форму
REINDEX
нельзя выполнить в блоке транзакции.имя
Имя определённого индекса, таблицы или базы данных, подлежащих переиндексации. В настоящее время
REINDEX DATABASE
иREINDEX SYSTEM
могут переиндексировать только текущую базу данных, так что их параметр должен соответствовать имени текущей базы данных.CONCURRENTLY
С этим указанием PostgreSQL перестроит индекс, не устанавливая никаких блокировок, которые бы предотвращали добавление, изменение или удаление записей в таблице, тогда как по умолчанию операция перестроения индекса блокирует запись (но не чтение) в таблице до своего завершения. При переиндексации в неблокирующем режиме есть ряд особенностей, о которых следует знать, — см. Неблокирующее перестроение индексов.
Для временных таблиц
REINDEX
всегда выполняется более простым, неблокирующим способом, так как они не могут использоваться никакими другими сеансами.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 DATABASE
, REINDEX SCHEMA
или REINDEX SYSTEM
выполняет не суперпользователь, индексы общих каталогов будут пропускаться, если только данный каталог не принадлежит этому пользователю (как правило, это так). Разумеется, суперпользователи могут переиндексировать всё без ограничений.
Переиндексирование секционированных таблиц или секционированных индексов не поддерживается. Переиндексировать можно каждую секцию по отдельности.
Неблокирующее перестроение индексов
Перестроение индекса может мешать обычной работе с базой данных. Обычно PostgreSQL блокирует запись в переиндексируемую таблицу и выполняет всю операцию построения индекса за одно сканирование таблицы. Другие транзакции могут продолжать читать таблицу, но при попытке вставить, изменить или удалить строки в таблице они будут заблокированы до завершения перестроения индекса.
PostgreSQL поддерживает перестроение индексов в режиме минимизации блокировок записи. Этот режим включается указанием CONCURRENTLY
команды REINDEX
. С данным указанием PostgreSQL должен выполнить два сканирования таблицы для каждого индекса, который нужно перестроить, и должен дождаться завершения всех активных транзакций, которые могут использовать данный индекс. В связи с этим в неблокирующем режиме производится в целом больше действий, и длительность переиндексирования значительно увеличивается. Однако благодаря тому, что во время перестроения индекса могут выполняться другие обычные операции, этот режим полезен, когда требуется перестроить индексы в производственной среде.
В ходе неблокирующего переиндексирования производятся следующие действия (каждое в отдельной транзакции). Если переиндексированию подлежат несколько индексов, сначала для всех индексов полностью выполняется один этап, а затем другой.
В каталог
pg_index
добавляется переходное определение индекса, которое затем заменит старое. Для предотвращения каких-либо изменений в схеме во время операции обрабатываемые индексы, а также связанные с ними таблицы защищаются блокировкой
на уровне сеанса.Для каждого нового индекса выполняется первый проход, на котором строится индекс. Когда индекс построен, его флаг
pg_index.indisready
переходит в состояние «true», чтобы этот индекс был готов к добавлениям, и таким образом он становится видимым для других сеансов сразу после окончания построившей его транзакции. Это действие выполняется в отдельной транзакции для каждого индекса.Затем выполняется второй проход, на котором в индекс вносятся кортежи, добавленные в таблицу во время первого прохода. Это действие также выполняется в отдельной транзакции для каждого индекса.
Все ограничения, ссылающиеся на индекс, переключаются на определение нового индекса, а также меняются имена индексов. В этот момент флаг
pg_index.indisvalid
нового индекса принимает значение «true», а старого — «false», и производится сброс кеша, в результате чего все сеансы, обращавшиеся к старому индексу, получают новую информацию.Флаг
pg_index.indisready
старого индекса сбрасывается в «false» во избежание добавления в него новых кортежей, как только завершатся текущие запросы, которые могли обращаться к этому индексу.Старые индексы удаляются. Блокировки
SHARE UPDATE EXCLUSIVE
уровня сеанса, установленные для индексов и таблиц, снимаются.
Если при перестроении индексов возникает проблема, например нарушение уникальности в уникальном индексе, REINDEX
прерывается, но оставляет после себя «нерабочий» новый индекс в дополнение к уже существующему. Этот индекс будет игнорироваться запросами, так как он может быть неполным; тем не менее он будет обновляться при изменении данных, что повлечёт дополнительные издержки. Команда psql
будет обозначать такой индекс как INVALID
(нерабочий):
postgres=# \d tab Table "public.tab" Column | Type | Modifiers --------+---------+----------- col | integer | Indexes: "idx" btree (col) "idx_ccnew" btree (col) INVALID
Если имя индекса с пометкой INVALID
оканчивается на ccnew
, это переходный индекс созданный при параллельной операции, и для исправления ситуации рекомендуется удалить его, выполнив DROP INDEX
, а затем попытаться ещё раз выполнить REINDEX CONCURRENTLY
. Если же имя нерабочего индекса оканчивается на ccold
, значит, это исходный индекс, удалить который по какой-то причине не получилось. Такой индекс рекомендуется просто удалить, так как нужный индекс был перестроен успешно.
Обычное построение индекса допускает одновременное построение других индексов для таблицы обычным методом, но неблокирующее построение для конкретной таблицы в один момент времени допускается только одно. Однако в любом случае никакие другие изменения схемы таблицы в это время не разрешаются. Другое отличие состоит в том, что в блоке транзакции может быть выполнена обычная команда REINDEX TABLE
или REINDEX INDEX
, но не REINDEX CONCURRENTLY
.
Как и любая длительная транзакция, операция REINDEX
с таблицей может повлиять на возможность удаления кортежей параллельной операцией VACUUM
с какой-либо другой таблицей.
Команда REINDEX SYSTEM
не поддерживает указание CONCURRENTLY
, так как системные каталоги нельзя переиндексировать в неблокирующем режиме.
Более того, в неблокирующем режиме нельзя перестроить индексы, связанные с ограничениями-исключениями. Если явно указать имя такого индекса в команде, будет выдана ошибка. Когда в неблокирующем режиме переиндексируется таблица или база данных, содержащая такие индексы, эти индексы пропускаются. (Перестроить такие индексы можно в обычном режиме, без указания CONCURRENTLY
.)
Примеры
Перестроение одного индекса:
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 TABLE CONCURRENTLY my_broken_table;
Совместимость
Команда REINDEX
отсутствует в стандарте SQL.
См. также
CREATE INDEX, DROP INDEX, reindexdbREINDEX PostgreSQL
Как и многие команды базы данных PostgreSQL, команда REINDEX очень удобна, когда нужно обновить систему базы данных. Он создан для воссоздания уже созданного ИНДЕКС вашей базы данных. Могут возникнуть ситуации, когда возникают проблемы с данными вашей базы данных из-за программных и аппаратных проблем. Эти проблемы могут привести к тому, что в вашей базе данных появятся неверные данные, а представления не смогут получить необходимые записи. Настало время восстановить наши уже созданные представления, чтобы использовать их снова с помощью инструкции REINDEX. В этой статье будет рассмотрен метод обновления уже сделанных индексов в базе данных PostgreSQL.
Содержание
- Использование графического интерфейса PostgreSQL PgAdmin
- Использование оболочки PostgreSQL (psql)
- Заключение
Использование графического интерфейса PostgreSQL PgAdmin
Давайте начнем с нового экрана рабочего стола Windows 10. Убедитесь, что в вашей Windows 10 уже есть база данных PostgreSQL, полностью настроенная для ее использования. Чтобы открыть графический интерфейс базы данных PostgreSQL, коснитесь панели поиска Windows 10 в левом нижнем углу экрана рабочего стола. Напишите «pgAdmin», и приложение появится. Выберите pgAdmin 4, чтобы быстро открыть его. После выбора для нормального открытия потребуется до 20 секунд.
Для запуска потребуется ваш пароль Сервера базы данных, который вы добавили во время установки. Добавьте этот пароль и нажмите кнопку «ОК», чтобы продолжить его использование. С левой стороны вы увидите опцию «Серверы». Разверните его, чтобы увидеть базы данных. Разверните параметр базы данных и нажмите на базу данных, которую вы хотите использовать для этой реализации. Здесь мы использовали слово «аксаясин». Щелкните значок инструмента запросов, чтобы открыть область запросов для базы данных, т. е. «aqsayasin».
Прежде чем что-либо делать, нам нужно перечислить все уже сделанные индексы нашей базы данных. Для этого вам нужно использовать инструкцию SELECT с использованием «pg_indexes» общедоступной схемы, извлекая из нее столбец «имя схемы», «имя таблицы», «имя индекса» и «определение индекса». У нас есть в общей сложности 6 индексов, которые уже есть в нашей базе данных «aqsayasin» с этим запросом.
Вы можете увидеть имена индексов уже здесь, в 3-м столбце слева от приведенного выше вывода. Давайте переиндексируем индекс «in_new» таблицы «Новая» и схемы «общедоступной», используя здесь команду REINDEX. Используйте ключевое слово «REINDEX» с именем индекса, которому предшествует ключевое слово «INDEX», как показано в запросе ниже. Выполнение этого запроса было успешным, поскольку на выходе отображается сообщение об успешном выполнении запроса. Теперь этот индекс обновляется, и если есть проблема, то ее больше не будет.
Не только индексы, но и команда REINDEX также может быть отключена для обновления всей таблицы вашей базы данных. Для этого вам нужно добавить имя таблицы вместо Index. Давайте переиндексируем таблицу «Atest» с помощью команды REINDEX, за которой следует ключевое слово «TABLE» перед именем таблицы. При выполнении этого запроса мы снова столкнулись с сообщением об успешном выполнении запроса в области вывода запроса. Таблица «Атест» также переиндексируется или создается заново для использования.
Не только таблицы и индексы, вы также будете использовать команду REINDEX для обновления всей схемы вашей системы. Это означает, что при переиндексации схемы все ваши базы данных или таблицы будут обновлены одним запросом. Таким образом, мы снова используем запрос REINDEX в нашем инструменте запросов для переиндексации «общедоступной» схемы нашей базы данных. Используйте ключевое слово «SCHEMA» после ключевого слова REINDEX и перед именем схемы в этом запросе. При выполнении вся ваша схема будет переиндексирована, и через некоторое время она покажет вам сообщение об успехе, т.е. это займет немного больше времени, чем обычный запрос. Этот запрос переиндексирует все базы данных в вашей системе, т. е. Postgres и другие.
Чтобы обновить одну базу данных с множеством таблиц, мы также можем использовать команду REINDEX. Вам просто нужно использовать ключевое слово «DATABASE» с именем базы данных для переиндексации, которому предшествует ключевое слово REINDEX. Давайте переиндексируем базу данных по умолчанию «Postgres», используя инструмент запроса другой базы данных, т. е. «aqsayasin. При выполнении этого запроса вы столкнетесь с ошибкой, показанной на изображении ниже. В нем говорится, что в настоящее время мы используем другую базу данных и пытаемся переиндексировать базу данных «Postgres». Таким образом, мы не можем делать то, что хотим. Таким образом, мы можем переиндексировать только базу данных, над которой работаем. Обновим нашу команду.
В том же запросе мы заменили имя базы данных, т.е. «aqsayasin». Запрос REINDEX теперь успешно после выполнения показывает, что база данных переиндексирована правильно.
Давайте используем ключевое слово SCHEMA в той же команде REINDEX, чтобы обновить или воссоздать индексы, найденные в нашем открытом каталоге базы данных, т. е. «aqsayasin». Это также приведет к воссозданию общих индексов. При выполнении этой инструкции в инструменте запросов мы до сих пор были успешными.
Использование оболочки PostgreSQL (psql)
Та же функциональность может быть достигнута с помощью оболочки PostgreSQL. Откройте оболочку PostgreSQL, выполнив поиск по ключевому слову «psql» в строке поиска. Нажмите на приложение оболочки MySQL и напишите имя локального хоста, который вы использовали. Теперь обязательно добавьте правильное имя вашей базы данных, в которой вы хотите выполнить переиндексацию, вместе с правильным номером порта. После этого вам будет предложено добавить имя пользователя и пароль для пользователя вашей базы данных. Вы также можете использовать базу данных «Postgres» и имя пользователя, то есть по умолчанию. Ваша оболочка будет готова к использованию.
Посмотрим, сколько индексов у нас в таблице «Ftest». Чтобы просмотреть их, используйте команду «\d+» с именем таблицы «Ftest». Вывод ниже показывает общее количество 2 индексов, найденных в этой таблице, т. е. iftest и inftest. Мы будем переиндексировать эти индексы в следующих запросах.
Используя ту же команду «\d+», мы получили индексы, отображаемые для таблицы «Значения». Он показывает единый индекс для этой таблицы, как показано ниже. Мы также будем переиндексировать его.
Начнем сначала переиндексировать таблицу «Ftest». Отбросьте инструкцию «REINDEX» в оболочке PostgreSQL с именем таблицы, т. е. Ftest. Это успешно, и теперь таблица переиндексирована. Полученное в результате слово «REINDEX» является доказательством нашего успеха здесь.
Чтобы переиндексировать схему PostgreSQL с именем «public», мы должны использовать ту же команду REINDEX с заголовком «SCHEMA». Это будет успешным снова в соответствии с результатом. Слово «REINDEX» — это сообщение об успехе на нашем экране.
Чтобы воссоздать или деиндексировать одну базу данных, необходимо указать имя базы данных. Только записи, относящиеся к этой базе данных, будут проиндексированы, и никакая другая база данных не будет изменена.
Вы обнаружите, что не можете переиндексировать другую базу данных, кроме открытой в данный момент, в соответствии с приведенной ниже командой.
Заключение
Мы узнали о концепции REINDEX в базе данных PostgreSQL. Мы рассмотрели примеры переиндексации существующего INDEX для конкретной таблицы и переиндексации всех индексов, найденных в других таблицах, за один шаг. Вся эта концепция переиндексации используется для обновления или воссоздания индексов для таблиц, баз данных и схемы, т. е. все в одном. Всем новым пользователям базы данных PostgreSQL эта статья будет весьма полезна для обучения.
PostgreSQL: Документация: 14: REINDEX
Описание
REINDEX
перестраивает индекс, используя данные, хранящиеся в таблице индекса, заменяя старую копию индекса. Существует несколько сценариев использования REINDEX
:
- .
Индекс поврежден и больше не содержит допустимых данных. Хотя теоретически этого никогда не должно происходить, на практике индексы могут быть повреждены из-за программных ошибок или аппаратных сбоев.
REINDEX
предоставляет метод восстановления. Индекс стал «раздутым», то есть содержит много пустых или почти пустых страниц. Это может произойти с индексами B-дерева в PostgreSQL при некоторых необычных шаблонах доступа.
позволяет сократить занимаемое индексом пространство путем записи новой версии индекса без мертвых страниц. Дополнительную информацию см. в Разделе 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
для определенного обрабатываемого индекса, которая блокирует операции чтения, пытающиеся использовать этот индекс. Напротив, ИНДЕКС DROP
на мгновение принимает ACCESS EXCLUSIVE 9.0006 блокирует родительскую таблицу, блокируя как запись, так и чтение. Последующий
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 должен выполнить два сканирования таблицы для каждого индекса, который необходимо перестроить, и дождаться завершения всех существующих транзакций, которые потенциально могут использовать этот индекс. Этот метод требует больше общей работы, чем стандартное перестроение индекса, и занимает значительно больше времени, так как необходимо ждать незавершенных транзакций, которые могут изменить индекс. Однако, поскольку он позволяет продолжать обычные операции во время перестроения индекса, этот метод полезен для перестроения индексов в производственной среде. Конечно, дополнительная нагрузка на ЦП, память и ввод-вывод, вызванная перестроением индекса, может замедлить выполнение других операций.
При одновременном переиндексировании выполняются следующие шаги. Каждый шаг выполняется в отдельной транзакции. Если необходимо перестроить несколько индексов, то каждый шаг перебирает все индексы перед переходом к следующему шагу.
В каталог
pg_index
добавлено новое определение временного индекса. Это определение будет использоваться для замены старого индекса. БлокировкаSHARE UPDATE EXCLUSIVE
на уровне сеанса применяется к переиндексируемым индексам, а также к связанным с ними таблицам, чтобы предотвратить любое изменение схемы во время обработки.Первый проход для построения индекса выполняется для каждого нового индекса. После построения индекса его флаг
pg_index.indisready
переключается на «true», чтобы сделать его готовым к вставкам, делая его видимым для других сеансов после завершения транзакции, выполнившей построение. Этот шаг выполняется в отдельной транзакции для каждого индекса.Затем выполняется второй проход для добавления кортежей, которые были добавлены во время выполнения первого прохода. Этот шаг также выполняется в отдельной транзакции для каждого индекса.
Все ограничения, относящиеся к индексу, изменены, чтобы ссылаться на новое определение индекса, и изменены имена индексов. В этот момент
pg_index.indisvalid
переключается на «true» для нового индекса и на «false» для старого, и выполняется инвалидация кеша, в результате чего все сеансы, которые ссылались на старый индекс, становятся недействительными.Старые индексы имеют
pg_index.indisready
переключено на «false», чтобы предотвратить вставку новых кортежей после ожидания завершения выполнения запросов, которые могут ссылаться на старый индекс.Старые индексы удалены. Сеансовые блокировки
ОБНОВЛЕНИЯ ОБЩЕГО ОБЕСПЕЧЕНИЯ EXCLUSIVE
для индексов и таблицы сняты.
Если при перестроении индексов возникает проблема, например нарушение уникальности в уникальном индексе, Команда 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
, так как системные каталоги не могут быть переиндексированы одновременно.
Кроме того, индексы ограничений исключения не могут быть переиндексированы одновременно. Если такой индекс указан непосредственно в этой команде, возникает ошибка. Если одновременно переиндексируется таблица или база данных с индексами ограничения исключения, эти индексы будут пропущены. (Такие индексы можно переиндексировать без СОВМЕСТНО
вариант.)
Каждый бэкэнд, работающий с REINDEX
, будет сообщать о своем прогрессе в представлении pg_stat_progress_create_index
. Подробности см. в Разделе 28.4.2.
Примеры
Перестроить один индекс:
ПЕРЕИНДЕКС ИНДЕКС my_index;
Перестроить все индексы в таблице my_table
:
ПЕРЕИНДЕКС ТАБЛИЦА my_table;
Перестроить все индексы в конкретной базе данных, не полагаясь на то, что системные индексы уже действительны:
$экспорт PGOPTIONS="-P"
$psql сломанный_дб
... сломанный_db=> ПЕРЕИНДЕКС БАЗЫ ДАННЫХ сломанный_db; сломанный_дб => \ q
Перестроить индексы для таблицы, не блокируя операции чтения и записи задействованных отношений во время переиндексации:
ПЕРЕИНДЕКС ТАБЛИЦЫ ОДНОВРЕМЕННО my_broken_table;
Совместимость
В стандарте SQL нет команды REINDEX
.
РЕИНДЕКС Postgres
Как и многие команды базы данных PostgreSQL, команда REINDEX очень удобна, когда нужно обновить систему базы данных. Он создан для воссоздания уже созданного ИНДЕКС вашей базы данных. Могут возникнуть ситуации, когда возникают проблемы с данными вашей базы данных из-за программных и аппаратных проблем. Эти проблемы могут привести к тому, что в вашей базе данных появятся неверные данные, а представления не смогут получить необходимые записи. Настало время восстановить наши уже созданные представления, чтобы использовать их снова с помощью инструкции REINDEX. В этой статье будет рассмотрен метод обновления уже сделанных индексов в базе данных PostgreSQL.
Использование графического интерфейса PostgreSQL PgAdmin:
Давайте начнем с нового экрана рабочего стола Windows 10. Убедитесь, что в вашей Windows 10 уже есть база данных PostgreSQL, полностью настроенная для ее использования. Чтобы открыть графический интерфейс базы данных PostgreSQL, коснитесь панели поиска Windows 10 в левом нижнем углу экрана рабочего стола. Напишите «pgAdmin», и приложение появится. Выберите pgAdmin 4, чтобы быстро открыть его. После выбора для нормального открытия потребуется до 20 секунд.
Для запуска потребуется ваш пароль Сервера базы данных, который вы добавили во время установки. Добавьте этот пароль и нажмите кнопку «ОК», чтобы продолжить его использование. С левой стороны вы увидите опцию «Серверы». Разверните его, чтобы увидеть базы данных. Разверните параметр базы данных и нажмите на базу данных, которую вы хотите использовать для этой реализации. Здесь мы использовали слово «аксаясин». Щелкните значок инструмента запросов, чтобы открыть область запросов для базы данных, т. е. «aqsayasin».
Прежде чем что-либо делать, нам нужно перечислить все уже сделанные индексы нашей базы данных. Для этого вам нужно использовать инструкцию SELECT с использованием «pg_indexes» общедоступной схемы, извлекая из нее столбец «имя схемы», «имя таблицы», «имя индекса» и «определение индекса». У нас есть в общей сложности 6 индексов, которые уже есть в нашей базе данных «aqsayasin» с этим запросом.
Вы можете увидеть имена индексов уже здесь в 3-м столбце слева от приведенного выше вывода. Давайте переиндексируем индекс «in_new» таблицы «Новая» и схемы «общедоступной», используя здесь команду REINDEX. Используйте ключевое слово «REINDEX» с именем индекса, которому предшествует ключевое слово «INDEX», как показано в запросе ниже. Выполнение этого запроса было успешным, поскольку на выходе отображается сообщение об успешном выполнении запроса. Теперь этот индекс обновляется, и если есть проблема, то ее больше не будет.
Можно отменить не только индексы, но и команду REINDEX для обновления всей таблицы базы данных. Для этого вам нужно добавить имя таблицы вместо Index. Давайте переиндексируем таблицу «Atest» с помощью команды REINDEX, за которой следует ключевое слово «TABLE» перед именем таблицы. При выполнении этого запроса мы снова столкнулись с сообщением об успешном выполнении запроса в области вывода запроса. Таблица «Атест» также переиндексируется или создается заново для использования.
Не только таблицы и индексы, вы также будете использовать команду REINDEX для обновления всей схемы вашей системы. Это означает, что при переиндексации схемы все ваши базы данных или таблицы будут обновлены одним запросом. Таким образом, мы снова используем запрос REINDEX в нашем инструменте запросов для переиндексации «общедоступной» схемы нашей базы данных. Используйте ключевое слово «SCHEMA» после ключевого слова REINDEX и перед именем схемы в этом запросе. При выполнении вся ваша схема будет переиндексирована, и через некоторое время она покажет вам сообщение об успехе, т.е. это займет немного больше времени, чем обычный запрос. Этот запрос переиндексирует все базы данных в вашей системе, т. е. Postgres и другие.
Чтобы обновить одну базу данных с множеством таблиц, мы также можем использовать команду REINDEX. Вам просто нужно использовать ключевое слово «DATABASE» с именем базы данных для переиндексации, которому предшествует ключевое слово REINDEX. Давайте переиндексируем базу данных по умолчанию «Postgres», используя инструмент запроса другой базы данных, то есть «aqsayasin. При выполнении этого запроса вы столкнетесь с ошибкой, показанной на изображении ниже. В нем говорится, что в настоящее время мы используем другую базу данных и пытаемся переиндексировать базу данных «Postgres». Таким образом, мы не можем делать то, что хотим. Таким образом, мы можем переиндексировать только базу данных, над которой работаем. Давайте обновим нашу команду.
Мы заменили имя базы данных в том же запросе, то есть «aqsayasin». Запрос REINDEX теперь успешно после выполнения показывает, что база данных переиндексирована правильно.
Давайте используем ключевое слово SCHEMA в той же команде REINDEX, чтобы обновить или воссоздать индексы, найденные в нашем открытом каталоге базы данных, то есть «aqsayasin». Это также приведет к воссозданию общих индексов. При выполнении этой инструкции в инструменте запросов мы до сих пор были успешными.
Использование оболочки PostgreSQL (psql):
Та же функциональность может быть достигнута с помощью оболочки PostgreSQL. Откройте оболочку PostgreSQL, выполнив поиск по ключевому слову «psql» в строке поиска. Нажмите на приложение оболочки MySQL и напишите имя локального хоста, который вы использовали. Теперь обязательно добавьте правильное имя вашей базы данных, в которой вы хотите выполнить переиндексацию, вместе с правильным номером порта. После этого вам будет предложено добавить имя пользователя и пароль для пользователя вашей базы данных. Вы также можете использовать базу данных «Postgres» и имя пользователя, то есть по умолчанию. Ваша оболочка будет готова к использованию.
Давайте посмотрим, сколько индексов у нас есть в нашей таблице «Ftest». Чтобы просмотреть их, используйте команду «\d+» с именем таблицы «Ftest». Вывод ниже показывает общее количество 2 индексов, найденных в этой таблице, таких толстых, как iftest и inftest. Мы будем переиндексировать эти индексы в следующих запросах.
С помощью той же команды «\d+» мы получили индексы, отображаемые для таблицы «Значения». Он показывает единый индекс для этой таблицы, как показано ниже. Мы также будем переиндексировать его.
Сначала начнем переиндексацию таблицы «Ftest». Отбросьте инструкцию «REINDEX» в оболочке PostgreSQL с именем таблицы, то есть Ftest. Это успешно, и теперь таблица переиндексирована. Полученное в результате слово «REINDEX» является доказательством нашего успеха здесь.
Чтобы переиндексировать схему PostgreSQL с именем «public», мы должны использовать ту же команду REINDEX с названием «SCHEMA». Это будет успешным снова в соответствии с результатом. Слово «REINDEX» — это сообщение об успехе на нашем экране.
Чтобы воссоздать или деиндексировать одну базу данных, необходимо указать имя базы данных. Только записи, относящиеся к этой базе данных, будут проиндексированы, и никакая другая база данных не будет изменена.
Вы обнаружите, что не можете переиндексировать другую базу данных, кроме открытой в данный момент, в соответствии с приведенной ниже командой.
Заключение
:Мы узнали о концепции REINDEX в базе данных PostgreSQL. Мы рассмотрели примеры переиндексации существующего INDEX для конкретной таблицы и переиндексации всех индексов, найденных в других таблицах, за один шаг. Вся эта концепция переиндексации используется для обновления или воссоздания индексов для таблиц, баз данных и схемы, т. е. все в одном. Всем новым пользователям базы данных PostgreSQL эта статья будет весьма полезна для обучения.
ПЕРЕИНДЕКС PostgreSQL | Реконструкция индексов с помощью PostgreSQL REINDEX
Для реконструкции одного или нескольких индексов обычно используется оператор PostgreSQL REINDEX. Иногда из-за проблем с программным обеспечением, ошибок или аппаратных сбоев индексы повреждались; в таких случаях мы можем использовать этот оператор для восстановления индекса. Мы можем воссоздать индекс для TABLE, SCHEMA, DATABASE или SYSTEM DATABASE и воссоздать INDEX. Оператор PostgreSQL REINDEX сначала удаляет все индексы, а затем создает все, что означает создание всех индексов с нуля. Оператор PostgreSQL REINDEX использует механизмы блокировки для восстановления содержимого индекса.
Синтаксис PostgreSQL REINDEX
Рассмотрим следующий синтаксис для понимания операторов:
Синтаксис:
REINDEX
[ ( VERBOSE ) ]
{СХЕМА | БАЗА ДАННЫХ | ТАБЛИЦА |СИСТЕМА | ИНДЕКС }
имя;
Объяснение PostgreSQL REINDEX
- VERBOSE: Это ключевое слово необязательно. Оператор показывает отчет о ходе выполнения, когда VERBOSE определяется во время переиндексации индексов.
- ИНДЕКС: Реконструировать заданный индекс.
- ТАБЛИЦА: Реконструировать все индексы определенной таблицы.
- БАЗА ДАННЫХ: Реконструировать все индексы указанной базы данных.
- СИСТЕМА: Реконструировать все индексы в системе определенной базы данных.
- имя: Это поле определяет имя индекса, таблицы, базы данных или схемы.
Мы можем воссоздать индекс для TABLE, SCHEMA, DATABASE или INDEX.
Давайте разберемся с синтаксисом каждого из них следующим образом:
1. Повторно создайте один индекс.
REINDEX INDEX index_name;
2. Пересоздайте все индексы таблицы.
ПЕРЕИНДЕКС ТАБЛИЦА имя_таблицы;
3. Воссоздайте все индексы в схеме.
REINDEX SCHEMA имя_схемы;
4. Воссоздать все индексы в конкретной базе данных.
REINDEX DATABASE имя_базы_данных;
5. Воссоздайте все индексы в системной базе данных.
REINDEX SYSTEM имя_базы_данных;
Как работает PostgreSQL REINDEX?
Отбрасывает и воссоздает индексы, что означает перестроение всех индексов с нуля. Оператор использует механизмы блокировки для воссоздания индексов.
Чтобы использовать инструкцию REINDEX, нам нужен владелец ИНДЕКСА, ТАБЛИЦЫ или БАЗЫ ДАННЫХ. Суперпользователи могут использовать оператор PostgreSQL REINDEX с чем угодно.
Примеры реализации
Ниже приведены примеры PostgreSQL REINDEX:
Пример №1. Повторное создание одного индекса
Рассмотрим следующий оператор, в котором нам нужно определить имя индекса после предложения PostgreSQL REINDEX INDEX; допустим, у нас есть индекс с именем student_index, тогда мы можем воссоздать его с помощью оператора PostgreSQL REINDEX.
Запрос:
ПЕРЕИНДЕКС ИНДЕКС student_index;
Вывод:
Пример 2. Повторное создание всех индексов таблицы
Рассмотрим следующий оператор, в котором нам нужно определить имя таблицы после предложения REINDEX TABLE. Предположим, что у нас есть таблица с именем student_table, и мы можем воссоздать все ее индексы с помощью инструкции PostgreSQL REINDEX.
Запрос:
ПЕРЕИНДЕКС ТАБЛИЦА student_table;
Вывод:
Пример 3.
Повторное создание всех индексов в схемеРассмотрим следующий оператор, в котором нам нужно определить имя схемы после предложения REINDEX SCHEMA. Предположим, что у нас есть схема с именем student_schema, и мы можем воссоздать все ее индексы с помощью инструкции PostgreSQL REINDEX.
Запрос:
ПЕРЕИНДЕКС СХЕМА student_schema;
Вывод:
Пример 4. Повторное создание всех индексов в конкретной базе данных
Рассмотрим следующий оператор, в котором нам нужно определить имя базы данных после предложения PostgreSQL REINDEX DATABASE. Предположим, что у нас есть база данных с именем student_database, тогда мы можем воссоздать все ее индексы с помощью оператора REINDEX.
Запрос:
ПЕРЕИНДЕКСИРОВАНИЕ БАЗЫ ДАННЫХ student_database;
Выход:
Пример 5. Повторное создание всех индексов в системной базе данных
Рассмотрим следующий оператор, в котором нам нужно определить имя базы данных после предложения PostgreSQL REINDEX SYSTEM.