Карта видимости PostgreSQL
VACUUM – достаточно затратный процесс. Поэтому для оптимизации затрат в версии 8.4 было введено понятие карты видимости (VM)
Каждое отношение таблицы имеет карту видимости (Visibility Map, VM) для отслеживания страниц, содержащих только кортежи, которые видны всем активным транзакциям; в ней также отслеживается, какие страницы содержат только замороженные кортежи. Она хранится вместе с данными главного отношения в отдельном файле, имя которого образуется номером файлового узла отношения с суффиксом _vm. Например, если файловый узел отношения — 12345, VM хранится в файле 12345_vm, в том же самом каталоге, что и основной файл отношения. Заметьте, что индексы не имеют VM.
Рис. 70 иллюстрирует процесс использования карты видимости.
Предположим, что таблица состоит из трех страниц, причем 0-я и 2-я страницы содержат “мертвые” кортежи, а 1-я страница - нет. В VM этой таблицы хранится информация о том, какие страницы содержат “мертвые” кортежи. В этом случае вакуумная обработка пропускает 1-ю страницу, обращаясь к информации VM.
Каждая VM состоит из одной или нескольких страниц размером 8 КБ,. В качестве примера можно привести один файл таблицы, карта relfilenode которого - 18751, с файлами FSM (18751_fsm) и VM (18751_vm), показанными ниже.
$ cd $PGDATA $ ls -la base/16384/18751* -rw------- 1 postgres postgres 8192 Apr 21 10:21 base/16384/18751 -rw------- 1 postgres postgres 24576 Apr 21 10:18 base/16384/18751_fsm -rw------- 1 postgres postgres 8192 Apr 21 10:18 base/16384/18751_vm
Обновленная VM
В версии 9.6 в целях повышения эффективности заморозки была усовершенствована и сама VM. Обновленная VM показывает информацию о том, заморожены или нет какие-либо кортежи на каждой странице (смотрите подраздел 6.3.3).




