F.35. pg_background#
F.35. pg_background #
F.35.2. Фоновый рабочий процесс Postgres #
pg_background
- это расширение для Tantor SE.
Изначально это
расширение было представлено Робертом Хаасом в сообществе PostgreSQL для
демонстрационных целей. Была добавлена дополнительная обработка ошибок и результаты команд.
Этот модуль позволяет пользователю выполнять произвольные команды в фоновом режиме и предоставляет возможность пользователям запускать
VACUUM
в фоновом режиме.Реализация автономной транзакции лучше, чем метод
dblink
.Позволяет выполнять задачи, такие как
CREATE INDEX CONCURRENTLY
, из процедурного языка.
Этот модуль поставляется с следующими SQL API:
pg_background_launch
: Этот API принимает SQL-команду, которую пользователь хочет выполнить, и размер буфера очереди. Эта функция возвращает идентификатор процесса фонового рабочего процесса.pg_background_result
: Этот API принимает идентификатор процесса в качестве входного параметра и возвращает результат команды, выполненной через фоновый рабочий процесс.pg_background_detach
: Этот API принимает идентификатор процесса и отсоединяет фоновый процесс, который ожидает, пока пользователь прочитает его результаты.
F.35.3. Установка #
Чтобы установить расширение, просто выполните команду:
CREATE EXTENSION pg_background;
F.35.4. Использование #
Для выполнения команды в фоновом режиме пользователь может использовать следующий SQL API
SELECT pg_background_launch('SQL COMMAND');
Чтобы получить результат выполнения команды фоновым рабочим процессом, пользователь может использовать следующую команду:
SELECT pg_background_result(pid)
pid - это идентификатор процесса, возвращаемый функцией pg_background_launch
Пример:
SELECT pg_background_launch('vacuum verbose public.sales'); pg_background_launch ---------------------- 11088 (1 row) SELECT * FROM pg_background_result(11088) as (result text); INFO: vacuuming "public.sales" INFO: index "sales_pkey" now contains 0 row versions in 1 pages DETAIL: 0 index row versions were removed. 0 index pages have been deleted, 0 are currently reusable. CPU 0.00s/0.00u sec elapsed 0.00 sec. INFO: "sales": found 0 removable, 0 nonremovable row versions in 0 out of 0 pages DETAIL: 0 dead row versions cannot be removed yet. There were 0 unused item pointers. Skipped 0 pages due to buffer pins. 0 pages are entirely empty. CPU 0.00s/0.00u sec elapsed 0.00 sec. INFO: vacuuming "pg_toast.pg_toast_1866942" INFO: index "pg_toast_1866942_index" now contains 0 row versions in 1 pages DETAIL: 0 index row versions were removed. 0 index pages have been deleted, 0 are currently reusable. CPU 0.00s/0.00u sec elapsed 0.00 sec. INFO: "pg_toast_1866942": found 0 removable, 0 nonremovable row versions in 0 out of 0 pages DETAIL: 0 dead row versions cannot be removed yet. There were 0 unused item pointers. Skipped 0 pages due to buffer pins. 0 pages are entirely empty. CPU 0.00s/0.00u sec elapsed 0.00 sec. result -------- VACUUM (1 row)
Если пользователь хочет выполнить команду и дождаться результата, то он может использовать следующий пример:
SELECT * FROM pg_background_result(pg_background_launch('vacuum verbose public.sales')) as (result TEXT); INFO: vacuuming "public.sales" INFO: index "sales_pkey" now contains 0 row versions in 1 pages DETAIL: 0 index row versions were removed. 0 index pages have been deleted, 0 are currently reusable. CPU 0.00s/0.00u sec elapsed 0.00 sec. INFO: "sales": found 0 removable, 0 nonremovable row versions in 0 out of 0 pages DETAIL: 0 dead row versions cannot be removed yet. There were 0 unused item pointers. Skipped 0 pages due to buffer pins. 0 pages are entirely empty. CPU 0.00s/0.00u sec elapsed 0.00 sec. INFO: vacuuming "pg_toast.pg_toast_1866942" INFO: index "pg_toast_1866942_index" now contains 0 row versions in 1 pages DETAIL: 0 index row versions were removed. 0 index pages have been deleted, 0 are currently reusable. CPU 0.00s/0.00u sec elapsed 0.00 sec. INFO: "pg_toast_1866942": found 0 removable, 0 nonremovable row versions in 0 out of 0 pages DETAIL: 0 dead row versions cannot be removed yet. There were 0 unused item pointers. Skipped 0 pages due to buffer pins. 0 pages are entirely empty. CPU 0.00s/0.00u sec elapsed 0.00 sec. result -------- VACUUM (1 row)