Postgresqlのチューニング

CPUに余裕がある場合のチューニング

パラレルスキャンとは検索を複数のプロセスで並列に実行する機能。

空きCPUを有効に利用できる。

パラレルスキャンは個々のプロセス(パラレルワーカプロセス)でテーブルの結合や集約処理を行って

最終的に集約して実行結果として返却する。

見方

EXPLAN ANALYZE SELECT id, avg(value) FROM table GROUP BY id;

Finalize Aggregate  (cost=52417.44..52417.45 rows=1 width=8) (actual time=322.346..322.346 rows=1 loops=1)
   Output: count(*)
   ->  Gather  (cost=52417.02..52417.43 rows=4 width=8) (actual time=314.456..322.339 rows=5 loops=1)
         Output: (PARTIAL count(*))
         Workers Planned: 4
         Workers Launched: 4
         ->  Partial Aggregate  (cost=51417.02..51417.03 rows=1 width=8) (actual time=295.995..295.995 rows=1 loops=5)
               Output: PARTIAL count(*)

... 省略

「Workers Launchedが4」となっているがこれがプロセス数を示す。

これとは別にリーダーとなるプロセスが存在するので、全てのプロセスは5になる。

PostgreSQL10以降はWorkers Launchedのデフォルトは2。

改善

例:デフォルトが2のため、4に変更する。

set max_parallel_workers_per_gather to 4;

※通常のSETだと現在のセッションにしか適用されないので、デフォで適用するには↓

alter database <database name> set max_parallel_workers_per_gather to 4;

パラレルスキャンの並列数の制御

パラメータ名 デフォルト値 説明
max_worker_processes 8 データベース全体で作成可能な全てのワーカプロセスの上限値
max_parallel_workers 8 データベース全体で作成可能なパラレルスキャン用のワーカプロセスの上限値
max_parallel_workers_per_gather 2 1つのリーダノードで集約することのできるパラレルワーカプロセスの上限値

加えて改善

パラレルスキャンは、かなり小さいテーブルに対しても並列処理を実行しようとする。

そのため小さいテーブルのレスポンス速度が満足の場合はパラレルスキャンをさせないようにする。

例:テーブルサイズが12MBの場合はパラレルスキャンを実行させない。

set min_parallel_table_scan_size='12MB'

パラレルスキャン対象テーブルの下限サイズ

パラメータ名 デフォルト値 説明
min_parallel_table_scan_size 8MB パラレルスキャンを試みる最小のテーブルサイズ
min_parallel_index_scan_size 512KB パラレルインデックススキャンを試みる最小のインデックスサイズ

第15章 パラレルクエリ