並列検索は、以下の手順で使用します。
1. 事前準備
並列検索を使用する場合、以下のパラメータを設定します。
注意
デフォルトでは動作しないため、必ずパラメータを設定してください。
パラメータ名 | 用途 | デフォルト | 値の指標 |
---|---|---|---|
max_worker_processes | システム全体で発生するワーカーの上限を設定します。 | 8 | max_parallel_workersと同じ値を指定します。 |
max_parallel_workers | システム全体で発生する並列検索のワーカーの上限を設定します。 | 0 | インスタンスとして制限する必要がない場合は、サーバのコア数を指定します。 将来的にCPUコア数を動的に増やす場合には、変更後のコア数を設定しておくことで、Symfoware Serverを再起動する必要がなくなります。 |
参照
パラメータの詳細および設定については、“運用ガイド”の“パラメータ”を参照してください。
対象のSQL文が“Seq Scan”または“Parallel Seq Scan”となるかをEXPLAIN文で確認します。ただし、“12.1 動作条件”を満たしていない場合は、並列処理は動作しません。
2. 効果の確認
上記の1を実施した状態で、対象のSQL文を“EXPLAIN ANALYZE”で実行することで、並列処理が動作したかを確認することができます。
以下に、EXPLAIN ANALYZEの出力結果例を示します。
postgres=# EXPLAIN ANALYZE select * from test_time where f1 > 0; QUERY PLAN ---------------------------------------------------------------- Parallel Seq Scan on test_time (cost=0.00..25206.88 rows=52428800 width=8) (actual time=0.025.. 25206.782 rows=11000 loops=1) Filter: (f1 > 0) Degree of parallelism: 6 query execution percentage: 20%
Degree of parallelism: 4 query execution percentage: 30%
Degree of parallelism: 2 query execution percentage: 50%
Total runtime: 26210.231 ms
“Parallel Seq Scan”が表示され、実行時の並列度と割合を確認できます。このとき、Degree of parallelismがmax_parallel_workers_per_queryと同じ値であり、かつquery execution percentageが100%であるとき、最も効果が得られていると判断できます。
また、“EXPLAIN”により、SQL文のみの評価として、並列化が選択されるかを確認することができます。
postgres=# EXPLAIN select * from test_time; QUERY PLAN ---------------------------------------------------------------- Parallel Seq Scan on test_time (cost=0.00..25206.88 rows=52428800 width=8)
上記の結果から、以下の場合に、チューニングを行います。
SQL文の実行時点で、システムリソースに十分な空きがあるかを確認します。(CPU使用率)
SQL文の実行時点で、サーバ内にコア1個分のCPU使用率の空きが必要です。例えば、コアの搭載数が2であり、コア1の使用率が60%、コア2の使用率が20%であれば並列検索がスケジュールされますが、コア1の使用率が60%、コア2の使用率が50%ならば並列検索はスケジュールされません。
以下のパラメータを確認します。
“max_parallel_workers”に、0が指定されていないか
“enable_parallelscan”に、offが指定されていないか
対象テーブルのサイズ(ページ数)が“parallel_scan_pages_threshold”の値より大きいか
上記に該当しない場合は、パラメータ“parallel_scan_cost_factor”の値を小さくして、再確認してください。
チューニングにより改善される可能性があります。“EXPLAIN ANALYZE”の結果から、以下を確認してください。
インスタンスとして、“max_parallel_workers”の値をサーバのコア数よりも小さい値に制限していて、CPU使用率に余裕がある場合は、“max_parallel_workers”の値を大きくして、再確認してください。また、“max_parallel_workers_per_query”を“max_parallel_workers”よりも小さい値で指定している場合は、“max_parallel_workers_per_query”の値を大きくして、再確認してください。
並列検索の対象となるSQL文を複数同時に実行すると、各SQL文が均等にCPUを使えるようにするために、システムが各SQLのワーカープロセスの多重度を小さくします。このため、1つのSQL文の処理のレスポンスを速くしたい場合には、並列検索の対象となるSQL文の同時実行数を減らしてください。