Postgresql

如何在 PostgreSQL 中禁用並行查詢?

  • January 9, 2019

我想在 PostgreSQL 中對一些東西進行基準測試。當我這樣做時,我通常會關閉數據庫目前正在使用的一些功能,只是為了我的會話,看看第二好的計劃是什麼。

雖然設置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。但是,我希望它看起來像一個預並行計劃,其中計劃本身甚至沒有計劃是並行的。我怎樣才能做到這一點?

從文件中,

max_parallel_workers_per_gather (integer)設置單個 Gather 或 Gather Merge 節點可以啟動的最大工作執行緒數。並行工作者從由 建立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

引用自:https://dba.stackexchange.com/questions/226654