Я пытаюсь понять, как PostgreSQL строит индекс concurrently без блокировки записи.Postgresql параллельный индекс
Может ли кто-нибудь описать шаги, выполняемые PostgreSQL, для этого, чтобы они непрерывно записывались в данные таблицы?
Я пытаюсь понять, как PostgreSQL строит индекс concurrently без блокировки записи.Postgresql параллельный индекс
Может ли кто-нибудь описать шаги, выполняемые PostgreSQL, для этого, чтобы они непрерывно записывались в данные таблицы?
Соответствующая деталь находится в комментариях к исходному коду. См 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, который содержит сведения об общем процессе.