27.4. Отслеживание выполнения
В PostgreSQL имеется возможность отслеживать выполнение определённых команд. В настоящее время такое отслеживание поддерживается только для команд CREATE INDEX
, VACUUM
и CLUSTER
. В будущем эта поддержка может быть расширена.
27.4.1. Отслеживание выполнения CREATE INDEX
Во время выполнения CREATE INDEX
или REINDEX
представление pg_stat_progress_create_index
будет содержать по одной строке для каждого обслуживающего процесса, создающего индексы в этот момент. Таблицы ниже показывают, какая информация будет отслеживаться, и поясняют, как её интерпретировать.
Таблица 27.22. Представление pg_stat_progress_create_index
Столбец | Тип | Описание |
---|---|---|
pid | integer | Идентификатор (PID) обслуживающего процесса |
datid | oid | OID базы данных, к которой подключён этот обслуживающий процесс. |
datname | name | Имя базы данных, к которой подключён этот обслуживающий процесс. |
relid | oid | OID таблицы, в которой создаётся индекс. |
index_relid | oid | OID создаваемого или перестраиваемого индекса. При выполнении CREATE INDEX в неблокирующем режиме содержит 0. |
command | text | Выполняемая команда: CREATE INDEX , CREATE INDEX CONCURRENTLY , REINDEX или REINDEX CONCURRENTLY . |
phase | text | Текущая фаза создания индекса. См. Таблицу 27.23. |
lockers_total | bigint | Общее число процессов, потребовавших ожидания, если таковые имеются. |
lockers_done | bigint | Число процессов, ожидание которых уже завершено. |
current_locker_pid | bigint | Идентификатор процесса, удерживающего конфликтующую блокировку в данный момент. |
blocks_total | bigint | Общее число блоков, которые должны быть обработаны в текущей фазе. |
blocks_done | bigint | Число блоков, уже обработанных в текущей фазе. |
tuples_total | bigint | Общее число кортежей, которые должны быть обработаны в текущей фазе. |
tuples_done | bigint | Число кортежей, уже обработанных в текущей фазе. |
partitions_total | bigint | При создании индекса в секционированной таблице этот столбец содержит общее число секций, в которых создаётся индекс. |
partitions_done | bigint | При создании индекса в секционированной таблице этот столбец содержит число секций, в которых индекс уже построен. |
Таблица 27.23. Фазы CREATE INDEX
Фаза | Описание |
---|---|
initializing | Инициализация — процедура CREATE INDEX или REINDEX подготавливается к созданию индекса. Эта фаза должна быть очень быстрой. |
waiting for writers before build | Ожидание окончания записи перед построением — процедура CREATE INDEX CONCURRENTLY или REINDEX CONCURRENTLY ожидает завершения транзакций, которые удерживают блокировки записи и могут читать таблицу. Эта фаза пропускается при выполнении операции в неблокирующем режиме. Выполнение процедуры в этой фазе отражается в столбцах lockers_total , lockers_done и current_locker_pid . |
building index | Построение индекса — код, реализующий метод доступа, строит индекс. В этой фазе методы доступа, поддерживающие отслеживание процесса, передают свои данные о текущем состоянии, и в этом столбце видна внутренняя фаза. Обычно ход построения индекса отражается в столбцах blocks_total и blocks_done , но также могут меняться и столбцы tuples_total и tuples_done . |
waiting for writers before validation | Ожидание окончания записи перед проверкой — процедура CREATE INDEX CONCURRENTLY или REINDEX CONCURRENTLY ожидает завершения транзакций, которые удерживают блокировки записи и могут записывать в таблицу. Эта фаза пропускается при выполнении операции в неблокирующем режиме. Выполнение процедуры в этой фазе отражается в столбцах lockers_total , lockers_done и current_locker_pid . |
index validation: scanning index | Проверка индекса: сканирование — процедура CREATE INDEX CONCURRENTLY сканирует индекс, находя кортежи, требующие проверки. Эта фаза пропускается при выполнении операции в неблокирующем режиме. Выполнение процедуры в этой фазе отражается в столбцах blocks_total (показывающем общий размер индекса) и blocks_done . |
index validation: sorting tuples | Проверка индекса: сортировка кортежей — процедура CREATE INDEX CONCURRENTLY сортирует результат фазы сканирования индекса. |
index validation: scanning table | Проверка индекса: сканирование таблицы — процедура CREATE INDEX CONCURRENTLY сканирует таблицу, чтобы проверить кортежи индекса, собранные в предыдущих двух фазах. Эта фаза пропускается при выполнении операции в неблокирующем режиме. Выполнение процедуры в этой фазе отражается в столбцах blocks_total (показывающем общий размер таблицы) и blocks_done . |
waiting for old snapshots | Ожидание старых снимков — процедура CREATE INDEX CONCURRENTLY или REINDEX CONCURRENTLY ожидает освобождения снимков теми транзакциями, которые могут видеть содержимое таблицы. Эта фаза пропускается при выполнении операции в неблокирующем режиме. Выполнение процедуры в этой фазе отражается в столбцах lockers_total , lockers_done и current_locker_pid . |
waiting for readers before marking dead | Ожидание завершения чтения перед отключением старого индекса — процедура REINDEX CONCURRENTLY ожидает завершения транзакций, которые удерживают блокировки чтения, прежде чем пометить старый индекс как нерабочий. Эта фаза пропускается при выполнении операции в неблокирующем режиме. Выполнение процедуры в этой фазе отражается в столбцах lockers_total , lockers_done и current_locker_pid . |
waiting for readers before dropping | Ожидание завершения чтения перед удалением старого индекса — процедура REINDEX CONCURRENTLY ожидает завершения транзакций, которые удерживают блокировки чтения, прежде чем удалить старый индекс. Эта фаза пропускается при выполнении операции в неблокирующем режиме. Выполнение процедуры в этой фазе отражается в столбцах lockers_total , lockers_done и current_locker_pid . |
27.4.2. Отслеживание выполнения VACUUM
В процессе выполнения VACUUM
представление pg_stat_progress_vacuum
будет содержать по одной строке для каждого обслуживающего процесса (включая рабочие процессы автоочистки), производящего очистку в данный момент. Таблицы ниже показывают, какая информация будет отслеживаться, и поясняют, как её интерпретировать. Выполнение команд VACUUM FULL
отслеживается через pg_stat_progress_cluster
, так как и VACUUM FULL
, и CLUSTER
перезаписывают таблицу, тогда как обычная команда VACUUM
модифицирует её саму. См. Подраздел 27.4.3.
Таблица 27.24. Представление pg_stat_progress_vacuum
Столбец | Тип | Описание |
---|---|---|
pid | integer | Идентификатор (PID) обслуживающего процесса |
datid | oid | OID базы данных, к которой подключён этот обслуживающий процесс. |
datname | name | Имя базы данных, к которой подключён этот обслуживающий процесс. |
relid | oid | OID очищаемой таблицы. |
phase | text | Текущая фаза очистки. См. Таблицу 27.25. |
heap_blks_total | bigint | Общее число блоков кучи в таблице. Это число отражает состояние в начале сканирования; блоки, добавленные позже, не будут (и не должны) обрабатываться текущей командой VACUUM . |
heap_blks_scanned | bigint | Число просканированных блоков кучи. Так как для оптимизации сканирования применяется карта видимости, некоторые блоки могут пропускаться без осмотра; пропущенные блоки входят в это общее число, так что по завершении очистки это число станет равно heap_blks_total . Этот счётчик увеличивается только в фазе scanning heap . |
heap_blks_vacuumed | bigint | Число очищенных блоков кучи. Если в таблице нет индексов, этот счётчик увеличивается только в фазе vacuuming heap (очистка кучи). Блоки, не содержащие «мёртвых» кортежей, при этом пропускаются, так что этот счётчик иногда может увеличиваться резкими рывками. |
index_vacuum_count | bigint | Количество завершённых циклов очистки индекса. |
max_dead_tuples | bigint | Число «мёртвых» кортежей, которое мы можем сохранить, прежде чем потребуется выполнить цикл очистки индекса, в зависимости от maintenance_work_mem. |
num_dead_tuples | bigint | Число «мёртвых» кортежей, собранных со времени последнего цикла очистки индекса. |
Таблица 27.25. Фазы VACUUM
Фаза | Описание |
---|---|
initializing | Инициализация — VACUUM готовится начать сканирование кучи. Эта фаза должна быть очень быстрой. |
scanning heap | Сканирование кучи — VACUUM в настоящее время сканирует кучу. При этом будет очищена и, если требуется, дефрагментирована каждая страница, а возможно, также будет произведена заморозка. Отслеживать процесс сканирования можно, следя за содержимым столбца heap_blks_scanned . |
vacuuming indexes | Очистка индексов — VACUUM в настоящее время очищает индексы. Если у таблицы есть какие-либо индексы, эта фаза будет наблюдаться минимум единожды в процессе очистки, после того, как куча будет просканирована полностью. Она может повторяться несколько раз в процессе очистки, если объёма maintenance_work_mem (или, в случае автоочистки, autovacuum_work_mem, если он задан) оказывается недостаточно для сохранения всех найденных «мёртвых» кортежей. |
vacuuming heap | Очистка кучи — VACUUM в настоящее время очищает кучу. Очистка кучи отличается от сканирования, так как она происходит после каждой операции очистки индексов. Если heap_blks_scanned меньше чем heap_blks_total , система вернётся к сканированию кучи после завершения этой фазы; в противном случае она начнёт уборку индексов. |
cleaning up indexes | Уборка индексов — VACUUM в настоящее время производит уборку в индексах. Это происходит после завершения полного сканирования кучи и очистки индексов и кучи. |
truncating heap | Усечение кучи — VACUUM в настоящее время усекает кучу, чтобы возвратить операционной системе объём пустых страниц в конце отношения. Это происходит после уборки индексов. |
performing final cleanup | Выполнение окончательной очистки — VACUUM выполняет окончательную очистку. На этой стадии VACUUM очищает карту свободного пространства, обновляет статистику в pg_class и передаёт статистику сборщику статистики, После этой фазы VACUUM завершит свою работу. |
27.4.3. Отслеживание выполнения CLUSTER
Во время выполнения CLUSTER
или VACUUM FULL
представление pg_stat_progress_cluster
будет содержать по одной строке для каждого обслуживающего процесса, выполняющего любую из этих команд. Таблицы ниже показывают, какая информация будет отслеживаться, и поясняют, как её интерпретировать.
Таблица 27.26. Представление pg_stat_progress_cluster
Столбец | Тип | Описание |
---|---|---|
pid | integer | Идентификатор (PID) обслуживающего процесса |
datid | oid | OID базы данных, к которой подключён этот обслуживающий процесс. |
datname | name | Имя базы данных, к которой подключён этот обслуживающий процесс. |
relid | oid | OID обрабатываемой таблицы. |
command | text | Выполняемая команда: CLUSTER или VACUUM FULL . |
phase | text | Текущая фаза обработки. См. Таблицу 27.27. |
cluster_index_relid | oid | Если таблица сканируется по индексу, это поле содержит OID данного индекса, а иначе — 0. |
heap_tuples_scanned | bigint | Число просканированных кортежей кучи. Этот счётчик увеличивается только в фазе seq scanning heap , index scanning heap или writing new heap . |
heap_tuples_written | bigint | Число записанных кортежей кучи. Этот счётчик увеличивается только в фазе seq scanning heap , index scanning heap или writing new heap . |
heap_blks_total | bigint | Общее число блоков кучи в таблице. Это число отражает состояние в начале фазы seq scanning heap . |
heap_blks_scanned | bigint | Число просканированных блоков кучи. Этот счётчик увеличивается только в фазе seq scanning heap . |
index_rebuild_count | bigint | Число перестроенных индексов. Это счётчик увеличивается только в фазе rebuilding index . |
Таблица 27.27. Фазы CLUSTER и VACUUM FULL
Фаза | Описание |
---|---|
initializing | Команда готовится начать сканирование кучи. Эта фаза должна быть очень быстрой. |
seq scanning heap | Команда в данный момент сканирует таблицу последовательным образом. |
index scanning heap | CLUSTER в данный момент сканирует таблицу по индексу. |
sorting tuples | CLUSTER в данный момент сортирует кортежи. |
writing new heap | CLUSTER в данный момент записывает новую кучу. |
swapping relation files | Команда в данный момент переставляет только что построенные файлы на место. |
rebuilding index | Команда в данный момент перестраивает индекс. |
performing final cleanup | Команда выполняет окончательную очистку. После этой фазы CLUSTER или VACUUM FULL завершит работу. |