27.4. Отслеживание выполнения
В Postgres Pro имеется возможность отслеживать выполнение определённых команд. В настоящее время такое отслеживание поддерживается только для команд CREATE INDEX, VACUUM и CLUSTER. В будущем эта поддержка может быть расширена.
27.4.1. Отслеживание выполнения CREATE INDEX
Во время выполнения CREATE INDEX или REINDEX представление pg_stat_progress_create_index будет содержать по одной строке для каждого обслуживающего процесса, создающего индексы в этот момент. Таблицы ниже показывают, какая информация будет отслеживаться, и поясняют, как её интерпретировать.
Таблица 27.23. Представление 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.24. | 
| 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.24. Фазы 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.25. Представление pg_stat_progress_vacuum
| Столбец | Тип | Описание | 
|---|---|---|
| pid | integer | Идентификатор (PID) обслуживающего процесса | 
| datid | oid | OID базы данных, к которой подключён этот обслуживающий процесс. | 
| datname | name | Имя базы данных, к которой подключён этот обслуживающий процесс. | 
| relid | oid | OID очищаемой таблицы. | 
| phase | text | Текущая фаза очистки. См. Таблицу 27.26. | 
| 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.26. Фазы 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.27. Представление pg_stat_progress_cluster
| Столбец | Тип | Описание | 
|---|---|---|
| pid | integer | Идентификатор (PID) обслуживающего процесса | 
| datid | oid | OID базы данных, к которой подключён этот обслуживающий процесс. | 
| datname | name | Имя базы данных, к которой подключён этот обслуживающий процесс. | 
| relid | oid | OID обрабатываемой таблицы. | 
| command | text | Выполняемая команда: CLUSTERилиVACUUM FULL. | 
| phase | text | Текущая фаза обработки. См. Таблицу 27.28. | 
| 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.28. Фазы 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завершит работу. |