PostgreSQL 并行查詢概述

2019獨角獸企業重金招聘Python工程師標準>>> hot3.png

PostgreSQL從9.6版本開始加入并行查詢,并在PostgreSQL10和PostgreSQL11分別做了大量加強工作。下面從:

  • 何時啟用并行查詢功能
  • 并行查詢是如何工作的
  • worker進程數量越多,查詢性能越高嗎

?三個方面簡單介紹下并行查詢的機制。

--------------------------------------------------------------------------------

何時啟用并行查詢功能

? ? 是否啟用并行查詢實際上有諸多因素決定。總的來說,有以下兩個方面:

  • ? ?并行查詢開關等參數

????????在PostgreSQL系統中,并行查詢的開關是max_parallel_workers_per_gather,它所表示的是單個Gather節點所能開啟的最大worker進程數量。當設置為0時,是?禁用并行查詢,即沒有可提供的并行查詢的worker進程;該參數的默認值是2,即每個Gather節點最多可以有2個worker進程。需要注意的是,postgresql.conf文件中還有一個名為force_parallel_mode的參數(看參數名感覺像是并行查詢的開關參數),其實它表示是否強制開啟并行查詢,多用于測試為目的。如果設置為on,則無論何時都會進行并行查詢(實際上,這時并不見得會帶來查詢效率的提高,后面會有介紹),其默認值為off,這時系統會根據具體成本考慮是否啟用并行查詢。

????? ? 在并行查詢中,每個worker進程都會承擔部分的查詢工作。除了上面說的max_parallel_workers_per_gather參數外,系統還有一個參數max_parallel_workers,它決定系統所支持的最大的worker進程的數量,所以max_parallel_workers_per_gather的設定必須參考max_parallel_workers的值。當然,它們都得受限于max_worker_process(系統允許后臺開啟worker進程的最大數量)參數。

  • ? ?并行查詢成本考慮

????? ? 當參數決定可以進行并行查詢后,實際上是否可以進行并行查詢,還得進行一些成本上的考慮。因為并行查詢除了能帶來并行查詢上的效率外,還會有一些成本的消耗,比如并行帶來的數據分片,進程間的通信以及并發控制所帶來的的系統的開銷等。當數據量足夠大時,并行查詢帶來的效率可以抵消這些成本考慮;但是數據量比較小時,并行查詢可能不會帶來效率的提升,反而會降低了原有的性能。而對于并行帶來的成本,系統需要進行計算其代價,然后決定是否啟用并行查詢。

????? ? 在配置文件中,有專門對并行查詢成本的設置:

	parallel_tuple_cost = 0.1              # 后天進程傳遞tuple的代價parallel_setup_cost = 1000.0           # worker進程的啟動成本min_parallel_table_scan_size = 8MB     # 并行查詢規定表的最小數據量min_parallel_index_scan_size = 512kB   # 并行查詢規定的索引的最小數據量

????? ? 系統就是依托上面的參數進行計算并行查詢的成本。這些參數基本上采用默認值就好,當然除非有特殊要求或特殊環境。

并行查詢是如何工作

? ? 以普通查詢為例,下面看一下簡單查詢的示例:

highgo=# explain analyze select * from test where n = 9999;QUERY PLAN                                                       
------------------------------------------------------------------------------------------------------------------------Gather  (cost=1000.00..11822.39 rows=3984 width=36) (actual time=2.014..196.880 rows=1 loops=1)Workers Planned: 2Workers Launched: 2->  Parallel Seq Scan on test  (cost=0.00..10423.99 rows=1660 width=36) (actual time=76.604..141.282 rows=0 loops=3)Filter: (n = 9999)Rows Removed by Filter: 333333Planning time: 0.044 msExecution time: 196.904 ms
(8 行記錄)

通過EXPLAIN可以查看并行查詢的執行計劃。當用戶輸入一個查詢語句時,查詢分析,查詢重寫以及查詢規劃都和原來一樣,只有到執行計劃時,才開始真正進入并行查詢環節。上面執行計劃中,Gather節點只是執行計劃的一個子節點,屬于執行計劃的一部分,當查詢執行走到Gather節點時,會話進程會申請一定數量的worker進程(根據配置參數,以及成本確定)來進行并行查詢過程。在這些worker進程中,有一個充當leader worker的角色,負責收集匯總各個worker進程查詢的結果。該leader worker進程也會根據查詢的數據量大小承擔部分的并行查詢部分。執行過程如下圖所示:

?

????? ? Leader worker進程和其他worker進程通過動態共享內存進行通信。其他worker進程(包括leader worker進程)把分擔查詢的結果存儲到共享內存中,然后由leader worker進程進行匯總整個查詢的結果。所以需要注意的是,由于并行查詢需要使用了動態共享內存,所以dynamic_shared_memory_type參數需要設置為none以外的值。

?

worker進程數量越多,查詢性能越高嗎

前面也提到,并不是所有的查詢都能適用于并行查詢。因為考慮到系統的開銷以及進程占用資源的情況,也并不是開啟的worker數量越多,查詢效率越高。下面以對同一個表做同樣的查詢,然后開啟不同的worker數量來測試一下。

  • 開啟 1 個worker 進程
highgo=# explain analyze select * from test where n = 4000000;QUERY PLAN                                          ----------------------------------------------------------------------------------------------Gather  (cost=1000.00..59888.81 rows=1 width=4) (actual time=244.328..301.458 rows=1 loops=1)Workers Planned: 1Workers Launched: 1->  Parallel Seq Scan on test  (cost=0.00..58888.71 rows=1 width=4) (actual time=268.845..297.372 rows=0 loops=2)Filter: (n = 4000000)Rows Removed by Filter: 2500000Planning time: 0.119 msExecution time: 302.026 ms
(8 rows)
  • 開啟 2 個worker 進程
highgo=# explain analyze select * from test where n = 4000000;QUERY PLAN                                          ----------------------------------------------------------------------------------------------Gather  (cost=1000.00..49165.77 rows=1 width=4) (actual time=218.212..218.287 rows=1 loops=1)Workers Planned: 2Workers Launched: 2->  Parallel Seq Scan on test  (cost=0.00..48165.67 rows=1 width=4) (actual time=200.619..213.684 rows=0 loops=3)Filter: (n = 4000000)Rows Removed by Filter: 1666666Planning time: 0.117 msExecution time: 219.005 ms
  • 開啟 4 個worker 進程

????????設置4個worker,但是實際上基于成本考慮只啟用了3個。????

highgo=# explain analyze select * from test where n = 4000000;QUERY PLAN                                          ---------------------------------------------------------------------------------------------Gather  (cost=1000.00..43285.39 rows=1 width=4) (actual time=190.967..191.017 rows=1 loops=1)Workers Planned: 3Workers Launched: 3->  Parallel Seq Scan on test  (cost=0.00..42285.29 rows=1 width=4) (actual time=174.275..182.767 rows=0 loops=4)Filter: (n = 4000000)Rows Removed by Filter: 1250000Planning time: 0.119 msExecution time: 191.817 ms
(8 rows)

?

  • 通過create table test(n int) with (parallel_workers = 4);強制啟動4個worker進程測試。
highgo=# explain analyze select * from test where n = 4000000;QUERY PLAN                                          ----------------------------------------------------------------------------------------------Gather  (cost=1000.00..38749.10 rows=1 width=4) (actual time=181.145..181.315 rows=1 loops=1)Workers Planned: 4Workers Launched: 4->  Parallel Seq Scan on test  (cost=0.00..37749.00 rows=1 width=4) (actual time=163.565..169.837 rows=0 loops=5)Filter: (n = 4000000)Rows Removed by Filter: 1000000Planning time: 0.050 msExecution time: 185.391 ms

對比查詢結果:

1 worker 進程2 worker 進程3 worker 進程4 worker 進程
302.026 ms219.005 ms191.817 ms185.391 ms

可以看出,查詢效率并沒有隨worker數量線性增加;在啟用3個worker進程 和 4個worker進程進行并行查詢時,查詢效率基本一致了。所以并不是開啟的worker數量越多,查詢效率越高,這個也是系統有成本考慮在內。

?

?

轉載于:https://my.oschina.net/tianbing/blog/3029493

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/536606.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/536606.shtml
英文地址,請注明出處:http://en.pswp.cn/news/536606.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

linux下得到date命令,linux下date命令獲得今天日期的用法

1。獲取今天日期的各類用法:oracle[roottest ~]# date %Y_%m_%d2016_05_22[roottest ~]# date %Y_%m_%d2016_05_22ide[roottest ~]# date "%Y_%m_%d"2016_05_22[roottest ~]# date %Y_%m_%d2016_05_22[roottest ~]# date "%Y_%m_%d"2016_05_22i…

Quarkus:一個Kubernetes原生Java框架

Red Hat發布了Quarkus,這是一個為GraalVM和OpenJDK HotSpot量身定制的Kubernetes原生Java框架。Quarkus的目標是使Java成為Kubernetes和無服務器環境中的領先平臺,為開發人員提供統一的反應式和命令式編程模型。 Quarkus利用Java開發人員使用的一系列庫&…

分區安裝linux,怎樣安裝Linux?

我的機子上裝了win2000,想裝個Linux可是在安裝時,竟然D 、E盤都不見了,win2000也進不去了我只得重裝2000,現在我都不敢裝Linux了請高手指點!|你最好用PQMAGIC先分區,大約2。5G空間就夠了,可以參…

linux scp傳輸文件命令

scp -r /opt/test root192.168.2.105:/opt 轉載于:https://www.cnblogs.com/LynnChen/p/10620576.html

pg10 10.3 1 linux64,Install Postgresql 10 In Ubutnu 16.04 LTS

PostgreSQL數據庫是一個高性能的全功能的開源關系型數據庫,這里講解一下如何在Ubuntu 16.04 LTS 下安裝 PostgreSQL 10。添加軟件源wget -q -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -sudo sh -c echo "deb http://apt.po…

nginx能訪問html靜態文件但無法訪問php文件

nginx.conf中紅框部分修改成你的實際網站根目錄轉載于:https://www.cnblogs.com/IT-Crowd/p/10626549.html

linux虛擬光驅掛載方法,Linux操作系統下虛擬光驅(iso)的掛載

1、掛載iso文件一般查看iso文件內容,只需要:#mount -t iso9660 -o loop xxx.iso /mnt/cdrom就可以在/mnt/cdrom下看到xxx.iso的內容。2、復制光盤為iso鏡像#dd if/dev/hdb ofxxx.iso或者#cp /dev/cdrom xxx.iso3、虛擬iso為設備#rm -rf /dev/cdrom //刪除…

[深度概念]·K-Fold 交叉驗證 (Cross-Validation)的理解與應用

個人主頁--> xiaosongshine.github.io/ 1.K-Fold 交叉驗證概念在機器學習建模過程中,通行的做法通常是將數據分為訓練集和測試集。測試集是與訓練獨立的數據,完全不參與訓練,用于最終模型的評估。在訓練過程中,經常會出現過擬合…

linux mariadb 升級,linux mariadb

linux mariadb轉載 一 安裝下載mariaDB MariaDB-5.5.29-rhel5-x86_64-common.rpm 和MariaDB-5.5.29-rhel5-x86_64-server.rpm 包,MariaDB-5.5.29-rhel5-x86_64-client.rpm2.然后再http.//yum。mariadb。org/ 找到 RPM-GPG-KEY-MariaDB 這個PGP文件,把文件放入到/etc…

Linux Note

日期:2019/3/31 內容:Linux學習筆記 一、Linux命令 ls -l 操作效果 第一列:文件權限 一共10位。 01(r)2(w)3(x)4(r)5(w)6(x)7(r)8(w)9(x)文件類型文件所有者權限 usr權限,u權限文件所有者所屬組成員的權限 group權限,g…

linux查看usb鼠標是否啟動,Linux USB鼠標驅動注解及測試

參考2.6.14版本中的driver/usb/input/usbmouse.c。鼠標驅動可分為多個部分:驅動加載部分、probe部分、open部分、urb回調函數處理部分。下文陰影部分為注解。一、 驅動加載部分static int __init usb_mouse_init(void){int retval usb_register(&usb_mouse_…

退役前的最后的做題記錄upd:2019.04.04

考試考到自閉&#xff0c;每天被吊打。 還有幾天可能就要AFO了呢。。。 Luogu3602&#xff1a;Koishi Loves Segments 從左向右&#xff0c;每次刪除右端點最大的即可。 [HEOI2014]南園滿地堆輕絮 答案一定是 \(\lceil \frac{max_{1\le i < j \le n}(a_i-a_j)}{2} \rceil\)。…

linux ssh-add,linux – 如何使ssh-add從文件讀取密碼?

根據您的發行版本和ssh-add的版本,您可以使用或不使用以這種方式從stdin讀取密碼的ssh-add的-p選項&#xff1a;cat passfile | ssh-add -p keyfile如果這不工作,您可以使用Expect,Unix工具使交互式應用程序非互動.你必須從你的包管理器安裝它.我為你準備了一個工具.只需將內容…

linux nginx F配置,linux下nginx的安裝及配置

1、安裝nginx前&#xff0c;咱們首先要確保系統安裝了g、gcc、openssl-devel、pcre-devel和zlib-devel軟件&#xff0c;可經過如圖所示命令進行檢測,若是以安裝咱們能夠經過圖二所示卸載&#xff1a;linuxyum install gcc-cyum -y install zlib zlib-devel openssl openssl--de…

你缺啥,你缺一個得力的辦公軟件

其實你缺啥我都知道&#xff0c;但是&#xff0c;我又不能給你發工資&#xff0c;還得你自己努力工作才行。不過我可以給你分享幾款好用的辦公軟件&#xff0c;對你在進行有效率的辦公會有很大幫助的。曲奇辦公是一款以文檔為載體的企業辦公管理應用。幫助企業快速實現業務標準…

C語言做一個表格的程序,用C語言畫個簡單表格

今天見到個題目&#xff0c;就把他做了&#xff0c;題目如下&#xff1a;在圖形環境中很容易做出漂亮的表格。但在控制臺環境中就比較困難了。有的時候可以用一些符號大略地模擬&#xff1a;(word文檔中可能不整齊&#xff0c;拷貝到記事本中看)-------------|abc |xyztt|…

深度學習框架PyTorch一書的學習-第四章-神經網絡工具箱nn

參考https://github.com/chenyuntc/pytorch-book/tree/v1.0 希望大家直接到上面的網址去查看代碼&#xff0c;下面是本人的筆記 本章介紹的nn模塊是構建與autograd之上的神經網絡模塊 除了nn外還會介紹神經網絡中常用的工具&#xff0c;比如優化器optim、初始化init等 1.nn.Mod…

高級語言程序設計c 華南理工,華南理工大學高級語言程序設計(C)期末練習題

.. 《高級語言程序設計(C)》練習題一&#xff0e;單項選擇題1.用C語言編制的源程序要變為目標程序必須要經過( )。(a) 解釋(b) 匯編(c) 編輯(d) 編譯2. 執行C程序時出現的“溢出”錯誤屬于( )錯誤。(a) 編譯(b) 連接(c) 運行(d) 邏輯3. 按C標識符的語法規定&#xff0c;合法的標…

bevfusion 學習筆記

目錄 tensorrt ros部署&#xff1a; 也依賴ros2 c ros2安裝指導&#xff1a; 相機標定工具源碼&#xff1a; 官方github&#xff0c;部分模型開源 tensorrt ros部署&#xff1a; https://github.com/linClubs/BEVFusion-ROS-TensorRT 也依賴ros2 c GitHub - newintelli…

地鐵售票系統設計思想及部分代碼

設計思想&#xff1a;地鐵售票系統的關鍵點在于換乘&#xff0c;所以首先要分為換乘和不換乘兩種情況。不換乘比較簡單&#xff0c;通過起始站名和終點站名查詢他們的num&#xff0c;然后list打包輸出到jsp就可以。換乘的話就先要找到兩條線路&#xff0c;找到兩條線路的交點也…