パラレルクエリの容量と現在のワーカー使用状況を確認
PostgreSQLパフォーマンスコマンド
-- Parallel worker pool settings
SELECT name, current_setting(name) AS value
FROM pg_settings
WHERE name IN ('max_worker_processes', 'max_parallel_workers', 'max_parallel_workers_per_gather',
'max_parallel_maintenance_workers', 'parallel_setup_cost', 'parallel_tuple_cost',
'min_parallel_table_scan_size', 'min_parallel_index_scan_size')
ORDER BY name;
-- Queries currently running in parallel and their worker counts
SELECT a.pid AS leader_pid,
count(w.pid) AS workers_running,
current_setting('max_parallel_workers')::int AS max_parallel_workers,
now() - a.query_start AS runtime,
left(a.query, 80) AS query
FROM pg_stat_activity a
JOIN pg_stat_activity w ON w.leader_pid = a.pid AND w.pid <> a.pid
GROUP BY a.pid, a.query_start, a.query
ORDER BY workers_running DESC;
-- Pin / reset the planned worker count for a single table
ALTER TABLE orders SET (parallel_workers = 4);
ALTER TABLE orders RESET (parallel_workers);概要
パラレルクエリの上限と、各リーダープロセスが現在使用しているパラレルワーカー数を表示する。表ごとのワーカー数の設定例を示す。
使用する場面
分析クエリが想定より遅いとき、計画が'Workers Planned' > 'Workers Launched'を示すとき、CPUコアが遊んでいるときに。
注意
max_parallel_workersはmax_worker_processes(再起動が必要)で上限が決まり、そのプールは論理レプリケーションワーカーや他のバックグラウンドワーカーと共有される。OLTPでは、max_parallel_workers_per_gatherが高いと同時実行時にCPUが飽和する。各ワーカーは独自のwork_memも使用する。データを書き込むクエリや行をロックするクエリ(CREATE TABLE AS / SELECT INTOを除く)、カーソル、PARALLEL UNSAFE関数を呼び出すクエリにはパラレル計画は作成されない。ALTER TABLE ... SET (parallel_workers)は短時間のShareUpdateExclusiveLockを取得する。