web-dev-qa-db-ja.com

PostgreSQLで並列クエリを無効にするにはどうすればよいですか?

PostgreSQLのいくつかのベンチマークを行いたい。これを行うとき、私は通常、データベースが現在使用している機能の一部をオフにして、自分のセッションでのみ、2番目に最適な計画を確認します。

max_parallel_works = 0を設定しましたが、まだ並行プランを取得しています。

                                                         QUERY PLAN                                                         
----------------------------------------------------------------------------------------------------------------------------
 Gather  (cost=1000.00..120892.01 rows=1000 width=15) (actual time=0.444..4781.539 rows=666667 loops=1)
   Workers Planned: 2
   Workers Launched: 0
   ->  Parallel Seq Scan on foo  (cost=0.00..119792.01 rows=417 width=15) (actual time=0.102..4711.530 rows=666667 loops=1)
         Filter: (lower(x) ~~ '%999.com'::text)
         Rows Removed by Filter: 9333333
 Planning time: 0.124 ms
 Execution time: 4801.491 ms
(8 rows)

Workers Launched: 0と書いてあるのは知っています。しかし、私はそれが計画自体がnotである並列前の計画のように見えることを望んでいます。どうすればこれを達成できますか?

2
Evan Carroll

ドキュメントから、

max_parallel_workers_per_gather (integer)単一の収集ノードまたは収集マージノードで開始できるワーカーの最大数を設定します。並列ワーカーは、max_worker_processesによって確立されたプロセスのプールから取得され、max_parallel_workersによって制限されます。要求された数のワーカーは、実際には実行時に利用できない場合があることに注意してください。これが発生すると、計画は予想よりも少ないワーカーで実行され、非効率になる可能性があります。デフォルト値は2です。 この値を0に設定すると、クエリの並列実行が無効になります。

したがって、並列クエリ計画の使用を無効にするには、

SET max_parallel_workers_per_gather = 0;

ご覧のとおり、同じクエリ、

                                                  QUERY PLAN                                                  
--------------------------------------------------------------------------------------------------------------
 Seq Scan on foo  (cost=0.00..207292.03 rows=1000 width=15) (actual time=0.082..4715.721 rows=666667 loops=1)
   Filter: (lower(x) ~~ '%999.com'::text)
   Rows Removed by Filter: 9333333
 Planning time: 0.083 ms
 Execution time: 4736.202 ms
7
Evan Carroll