1. 程式人生 > 其它 >PG-並行查詢

PG-並行查詢

PostgreSQL 並行查詢
並行查詢
並行查詢引入新節點
  • Gather:並行執行子計劃的結果向上層節點輸出,不保證有序

  • GatherMerge:並行執行子計劃的結果向上層節點有序輸出

並行相關引數
引數 描述
max_work_processer(integer) 設定系統支援的最大後臺程序,預設值為8,此引數調整後需要重啟資料庫才生效。備庫需要大於主庫
max_parallel_workers(integer) 系統並行查詢程序,預設值為8。其值不超過max_work_processer
max_parallel_workers_per_gather(integer) 執行啟用並行程序的程序數,預設值2。設定成0則禁用並行查詢。
parallel_setup_cost(floating point) 優化器啟動並行程序的成本,預設為1000
parallel_tuple_cost(floating point) 設定優化器通過並行程序處理一行資料的成本,預設是0.1
min_parallel_table_scan_size(integer) 設定開啟並行的條件之一,表佔用空間小於此值將不會開啟並行,並行順序掃描場景下掃描的資料大小通常等於表大小,預設值8MB
min_parallel_index_scan_size(integer) 設定開啟並行的條件之一,實際上並行掃描不會掃描索引所有資料塊,只是掃描索引相關資料塊,預設值512kb
force_parallel_model(num) 強制開啟並行,OLTP生產環境開啟需要慎重,不建議開啟
select name,setting,unit,enumvals,vartype
  from pg_settings ps
 where 1=1
   and ps.name in (
         'force_parallel_mode',
         'max_worker_processes',
         'max_parallel_workers',
         'max_parallel_maintenance_workers',
         'max_parallel_workers_per_gather',
         --'min_parallel_relation_size',-- add 9.6,remove from 10
         'min_parallel_index_scan_size',
         'min_parallel_table_scan_size',
         'parallel_tuple_cost',
         'parallel_setup_cost',
         'parallel_leader_participation'
)
;
  • max_parallel_workers_per_gather :每個 Gather/GatherMerge 最大的並行 worker 數(不包含 leader),預設值為2
  • min_parallel_table_scan_size : 使用並行掃描的最小表大小,預設 8MB
  • min_parallel_index_scan_size : 使用並行掃描的最小索引大小,預設 512KB
並行計劃示意圖

並行查詢計劃中,處理使用者請求的 backend 程序稱之為主程序(leader),將執行時動態生成的程序稱之為工作程序(worker)。每個 worker 執行 Gather 節點以下計劃的一個副本,leader 節點主要負責處理 Gather 及其以上節點的操作,根據 worker 數不同,leader 也可能會執行 Gather 以下計劃的副本。

並行查詢中引入了兩個新的代價值
  • parallel_tuple_cost : 每個 Tuple 從 worker 傳遞給 master 的代價,即 worker 將一個 tuple 放入共享記憶體佇列,然後 master 從中讀取的代價,預設值為 0.1
  • parallel_setup_cost : 啟動並行查詢 worker 程序的代價,預設值為 1000
示例
-- 建立表
CREATE TABLE t_big(
	id int4,
	name character varying(32),
	create_time timestamp without time zone DEFAULT clock_timestamp()
);
-- 插入資料
INSERT INTO t_big(id,name)
SELECT n, n||'_tv' FROM generate_series(1,5000000) n;
-- 一個並行順序掃描的執行計劃
EXPLAIN ANALYSE SELECT * FROM t_big WHERE name = '1_tv';

-- 建立索引
create index id_t_big_name on t_big using btree (name); 
  • Workers Planned :執行計劃預估的並行程序數
  • Workers Launched: 查詢實際獲得的並行程序數。
  • Parallel Seq Scan on t_big :並行順序(全表)掃描
  • Planning time :生成執行計劃的時間
  • Execution time :SQL實際執行時間