Postgresql
如何在 PostgreSQL 中禁用並行查詢?
我想在 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