PG-並行查詢
阿新 • • 發佈:2021-10-15
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
: 使用並行掃描的最小表大小,預設 8MBmin_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.1parallel_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實際執行時間