爲啥放一張佩奇?它的真實面目其實是汽車裏的渦輪,渦輪增壓可以讓小排量的發動機有大排量發動機的爆發力。佩奇都已經配送了渦輪,號稱”渦輪豬“,PostgreSQL怎麼能不跟跟時尚。postgresql中,並行計算就是渦輪,利用好並行計算,你的postgresql就是渦輪增壓postgresql了,無痛享受數倍加速!怎麼樣,這個類比是不是有點尷尬,但話糙理不糙,總之,用並行計算爲你的查詢加速吧!
這裏我們先講講PostgreSQL中並行計算歷史,如何使用,效果及其注意的點。
9.6引入並行計算,之後的10和11不斷添磚加瓦。
PostgreSQL 10
- 新增min_parallel_table_scan_size和min_parallel_index_scan_size,用於控制超過多大的表大小(bytes)和索引大小(bytes)時,計劃中會使用並行;
- 並行btree掃描;
- 並行bitmap heap掃描;
- 並行merge joins;
- 允許無關的子查詢使用並行;
- 新增max_parallel_worker,用來控制並行數量;
- pg_stat_activity中可以查詢到parallel worker的查詢;
PostgreSQL 11
- 創建btree索引時可以並行;
- create table .. as,create materialized .. view和一些union可以並行;
- 優化了並行哈希連接(hash join)和並行順序掃描(sequence scan)。
地理數據中的操作是典型的計算量大的操作。
結構
彙總線程(Gather Node)
彙總線程是管理的角色,其派生出多個工作線程,把任務分解爲多個任務,分別派給工作線程,最後彙總結果。
工作線程(Worker)
工作線程實際執行被分配的任務。
原理
設置並行模式
要使用並行,有一些GUC是必須配置的:
- max_parallel_workers_per_gather,每個gather進程可啓動的worker進程最大數量;
- max_parallel_workers,pg可以啓動的parallel worker進程最大數量;
- max_worker_process,pg可以啓動的worker進程最大數量;
- parallel_leader_participation,gather進程是否應該參與計算。
此外,還有一些GUC決定了計劃器是否會引入並行機制。只有計劃器認爲執行查詢的開銷大於下面的閾值設定,纔會啓用並行計劃:
- parallel_tuple_cost,在兩個parallel worker線程直接傳遞單行數據的開銷,默認0.1;
- parallel_setup_cost,啓動parallel worker線程的開銷,默認1000;
- min_parallel_table_scan_size,執行查詢需要掃描的表數據大小,默認8M;
- min_parallel_index_scan_size,執行查詢需要掃描的表索引大小,默認512K;
pg11中並行模式默認是啓用的,我們使用explain可以查看某個查詢是否以並行的方式執行。
什麼時候並行不可用
- 涉及到對現有表寫數據或鎖行的查詢,create table as、select into、
create materialized view等創建新表的操作
例外 - 包含CTE(with)的查詢不支持並行