PostgreSQL - 讓PostGIS用上PostgreSQL的並行

爲啥放一張佩奇?它的真實面目其實是汽車裏的渦輪,渦輪增壓可以讓小排量的發動機有大排量發動機的爆發力。佩奇都已經配送了渦輪,號稱”渦輪豬“,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)的查詢不支持並行

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章