2013-08-22 3 views

ответ

2

Соответствующая деталь находится в комментариях к исходному коду. См the comments on validate_index in src/backend/catalog/index.c around line 2607:

Мы делаем параллельное построение индекса сначала вставив запись каталога для индекса через index_create(), пометив его не indisready и не indisvalid. Затем мы совершаем транзакцию и начинаем новую, а затем ждем всех транзакций, которые могли бы изменить таблицу для завершения.

.... и много, много больше. В основном «это сложно». Я попытаюсь объяснить это, но я не прочитал код в деталях, и я не знаю эту часть кода, поэтому только правильное описание - это комментарии и исходный код.

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

Весь процесс в значительной степени зависит от моментальных снимков и видимости MVCC. Это также значительно более дорогостоящим с точки зрения ввода-вывода, процессора и оперативной памяти, чем обычная сборка индекса.

validate_index вызывается DefineIndex in src/backend/commands/indexcmds.c, который содержит сведения об общем процессе.

Смежные вопросы