PostgreSQL——并行查詢

這里寫目錄標題

  • 一、并行查詢相關自己置參數
  • 二、并行掃描
    • 2.1、并行順序掃描
    • 2.2、并行索引掃描
    • 2.3、并行index-only掃描
    • 2.4、并行bitmap heap掃描
  • 三、并行聚合
  • 四、多表關聯
    • 4.1、Nested loop多表關聯
    • 4.2、Merge join多表關聯
    • 4.3、Hash join多表關聯

了解 Oracle 的朋友應該知道 Oracle 支持并行查詢,比如 SELECT 、 UPDATE 、 DELETE大事務開啟并行功能后能利用多核 CPU ,從而充分發揮硬件性能,提升大事務處理效率,PostgreSQL 在 9.6 版本前還不支持并行查詢, SQ L 無法利用多核 CPU 提升性能, 9.6 版本開始支持并行查詢,只是 9.6 版本的并行查詢所支持的范圍非常有限,例如只在順序掃描、多表關聯、聚合查詢中支持并行, 10 版本增強了并行查詢功能,例如增加了并行索引掃描 、并行 index-only 掃描、并行 bitmap heap 掃描等。

一、并行查詢相關自己置參數

  1. max_worker_processes(integer)
    設置系統支持的最大后臺進程數,默認值為 8 ,如果有備庫,備庫上此參數必須大于或等于主庫上的 此參數配置值, 此參數調整后需重啟數據庫生效 。
  2. max_parallel_workers (integer)
    設置系統支持的并行查詢進程數,默認值為 8 ,此參數受 max_worker_processes 參數限制,設置此參數的值比 max_worker processes 值高將無效 。當調整這個參數時建議同時調整 max_parallel workers _per _gather 參數值 。
  3. max_parallel_workers_per _gather (integer)
    設置允許啟用的并行進程的進程數,默認值為 2 ,設置成 0 表示禁用并行查詢,此參數受 max_worker_processes 參數和 max_parallel_workers 參數限制,因此并行查詢的實際進程數可能比預期的少,并行查詢比非并行查詢消耗更多的 CPU 、 IO 、內存資源,對生產系統有一定影 響 , 使用時需考慮這方面的因素,這三個參數的配置值大小關系通常如下所示:
max_worker_processes > max_parallel_workers > max_parallel_workers p er_gather
  1. parallel_setup_cost(floating point)
    設置優化器啟動并行進程的成本 ,默認為 1000 。
  2. parallel_tuple_cost(floating point)
    設置優化器通過并行進程處理一行數據的成本,默認為 0.1 。
  3. mi n_pa ra I lel_ta ble_sca n_size(integer)
    設置 開啟并行的 條件之一 , 表 占用 空 間小于此值將不會開啟并行,并行順序掃描場景下掃描的數據大小通常等于表大小 , 默認值為 8MB 。
  4. min_parallel_index_scan_size(integer)
    設置開啟 并行的 條件之一,實 際上并行索引掃描不會掃描索引所有數據塊,只是掃描索引相關數據塊,默認值為 512kb 。
  5. force_parallel_mode (enum)
    強制開啟并行, 一般作為測試目的, OLTP 生產環境開啟需慎重,一般不建議開啟 。

postgresql.conf 配置文件設置了以下參數:

max_worker_processes = 16
max_parallel_workers_per_gather = 4  		# taken from max_parallel_workers
max_parallel_worders = 8
parallel_tuple_cost = 0.1
parallel_setup+cost = 1000.0
min_parallel_table_scan_size = 8MB
min_parallel_index_scan_size = 612kb
force_parallel_mode = off

行查詢進程 數 預估值由 ~ 4&. max_parallel workers_per_陰陽控制,并行進程數預估值是指優化器解析 SQL 時執行計劃預計會啟用的并行進程數,而實際執行查詢時的并行進程數受參數 max_parallel_ workers 、 max_worker_processes 的限制,也就是說 SQL 實際獲得的并行進程數不會超過這兩個參數設直的值,比如 max worker_processes 參數 設直成 2, max_parallel_workers_per_gather 參數設直成 4 ,不考慮其他因素的情況下,并行查詢實際的并行進程數將會是 2 ,另一方面并行進程數據會受 min_parallel_table _scan_size 參數 的影響, flf 表的大小會影響并行進程數 。 并行查詢執行計劃中的 Workers Planned 表示執行計劃預估的并行進程 數 , Worker Launched 表示并行查詢實際獲得的并行進程數 。

二、并行掃描

2.1、并行順序掃描

介紹并行順序掃描之前先介紹順序掃描(sequential scan),順序掃描通常也稱之為掃描,全表掃描會掃描整張表數據,當表很大時,全表掃描會占用大量CPU、內存、源,對數據庫性能有較大影響,在OLTP事務型數據庫系統中應當盡量避免。
首先創建一張測試表,井插入500萬數據,如下所示:

create table test_big1 (id int4,name character varying(32),create_time timestamp without time zone default clock_timestamp()
);insert into test_big1(id, name)
select n, n || '_test' 
from generate_series(1, 50000000) n;

一個順序掃描的示例如下所示:

explain select *
from test_big1
where name = '1_test';

在這里插入圖片描述

以上執行計劃Seq Scan on test_bigl說明表test_bigl典型的順序掃描執行計劃,PostgreSQL中的順序掃描在9.6
上進行了順序掃描,這是版本開始支持并行處理,一個典
并行順序掃描會產生多個子進程,井利用多個邏輯CPU
并行全表掃描,一個并行順序掃描的執行計劃如下所示:

explain analyze select *
from test_big1
where name = '1_test';

在這里插入圖片描述

Workers Planned 表示執行計劃預估的并行進程數,
Worker Launched 表示查詢實際獲得的并行進程數,這里 Workers PlannedWorker Launched值都為 4 , Parallel Seq Scan on test_ big 1 表示進行了并行順序掃描, Planning time 表示生成執行計劃的時間, Execution time 表示 SQL 實際執行時間,從以 上可 以 看出, 開啟 4 個并行時 SQL 實際執行時間為 1367 毫秒。

接下來測試不開啟并行的 SQL 性能,由于 max_parallel_workers_per_gather 參數設置成了 4 , 設置成 0 表示關閉并行,在會話級別設置此參數值為 0 ,如下所示 :

set max_parallel_workers_per_gather = 0;

不開啟并行,執行計劃如下所示 :

explain analyze select *
from test_big1
where name = '1_test';

在這里插入圖片描述

不開啟并行時此 SQL 執行時間為50463毫秒,開啟井行查詢為32499毫秒。

2.2、并行索引掃描

Index Scan using 表示 執行計劃預計進行索引掃描, 索 引掃描也支持并行,稱為并行索引掃描 ( Parallel index scan ), 首 先在表 test_bigl 上創建索引, 如下所示 :

create index idx_test_big1_id 
on test_big1 using btree (id);

執行以下SQL,統計ID小于1千萬的記錄數,如下所示:

explain analyze select count(name)
from test_big1
where id < 10000000;

在這里插入圖片描述

根據以上執行計劃可以看出,進行了并行索引掃描,開啟了2個并行進程,在會話級別關閉并行查詢,如下所示:

SET max_parallel_workers_per_gather = 0;explain analyze select count(name)
from test_big1
where id < 10000000;

在這里插入圖片描述

執行計劃看出進行了索引掃描,沒有開啟并行。

2.3、并行index-only掃描

了解并行 index-only 掃描之前首先介紹下index-only掃描,顧名思義,index-only掃描是指只需掃描索引,也就是說SQL 僅根據索引就能獲得所需檢索 的 數據,而不需要通過索引回表查詢數據 。 例如 ,使用SQL統計ID小于100萬的記錄數,在開始測試之前,先在會話級別關閉 并行, 如下所示:

SET max_parallel_workers_per_gather = 0;explain select count(*)
from test_big1
where id < 10000000;

在這里插入圖片描述

上執行計劃主要看Index Only Scan這一 行 ,由于ID宇段上建 立了索引,統計記錄數不需要再回表查詢其他信息,因此進行了index-only掃描,接下來使用EXPLAIN ANALYZE執行此SQL,如下所示:

explain analyze select count(*)
from test_big1
where id < 10000000;

在這里插入圖片描述

index-only 掃描支持并行,稱為并行 index-only 掃描,接著測試并行 index-only掃描,在會話級別開啟并行功能,如下所示 :

SET max_parallel_workers_per_gather to default;explain analyze select count(*)
from test_big1
where id < 10000000;

在這里插入圖片描述

上執行計劃主要看 Parallel Index Only Scan 這段 ,進行了并行 index-only 掃描。

2.4、并行bitmap heap掃描

紹并行 bitmap heap 掃描之前先了解下 Bi tmap Index 掃描和 Bitmap Heap 掃描, 當 SQL的where 條件中出現or時很有可能出現 Bitmap Index 掃描 , 如下所示 :

explain select *
from test_big1
where id = 1 or id = 2;

在這里插入圖片描述

從以上執行計劃看出,首先執行兩次 Bitmap Index 掃描 獲取索 引項,之后將 Bitmap Index掃描獲取的結果合起來回表查 詢 ,這時在表test_bigl 上進行了Bitmap Heap 掃描 。

Bitmap Heap 掃描也支持并行,執行以下 SQL ,在查詢條件中將 ID 的選擇范圍擴大。

explain analyze select count(*)
from test_big1
where id < 1000000 or id > 49000000;

在這里插入圖片描述

會話級關閉并行查詢,如下所示:

set max_parallel_workers_per_gather = 0;explain analyze select count(*)
from test_big1
where id < 1000000 or id > 49000000;

在這里插入圖片描述

三、并行聚合

合操作是指使用 count() 、 sum() 等聚合函數 的 SQL ,以下執行 count ()函數統計表記錄總數,執行計劃如下所示 :

explain analyze select count(*)
from test_big1;

在這里插入圖片描述

從以上執行計劃 看 出, 首先進行 Part i al Aggregate , 開 啟了 四個 并 行進程, 最后進行Finalize Aggregate。

這個例子充分驗證 了聚合查詢 count ()能 夠支持并行 , 為 了 初 步測試并行性能,在會話級別關閉并行查詢,如下所示 :

set max_parallel_workers_per_gather = 0;explain analyze select count(*)
from test_big1;

在這里插入圖片描述

不同并行進程數下的全表掃描執行時間:
在這里插入圖片描述

四、多表關聯

4.1、Nested loop多表關聯

多表關聯 Nested loop 實際上是一個嵌套循環, 偽代碼如下所示 :

for	(i = 0; i < length(outer); i++)for (j = 0; j < length(inner); j++)if (outer[i] == inner[j])output(outer[i], inner[j]);

接著 測試 Nested loop 多表關聯場景 下使用到并行掃描 的情況,創建一張 test_small 小表,如下所示 :

create table test_small(id int4,name character varying(32)
);insert into test_small(id, name)
select n, n || '_small' 
from generate_series(1, 800000) n;

ANALYZE 命令用于收集表上的統計信息,使優化器能夠獲得更準確的執行計劃,兩表關聯執行計劃如下所示 :

explain analyze select test_small.name
from test_big1, test_small
where test_big1.id = test_small.id and test_small.id < 10000;

在這里插入圖片描述

從以上執行計劃可以 看出,首先在表 test_bigl 上進行 了 Index Only 掃描,用于檢索 id 小于 10000 的記錄,之后兩表進行 Nested loop 關聯同時在表 test_small I 上進行了并行 Bitmap Heap 掃描,用于檢索 id 小于 10000 的記 錄。

4.2、Merge join多表關聯

Merge join 多表關聯首先將兩個表進行排序,之后進行關聯宇段匹配 , Merge join 示例如下所示:

explain analyze select test_small.name
from test_big1, test_small
where test_big1.id = test_small.id
and test_small.id < 200000;

在這里插入圖片描述

4.3、Hash join多表關聯

ostgreSQL 多表關聯也支持 Hash join , 當關聯宇段沒有索引情況下兩表關聯通常會進行 Hash join ,接 下 來查看 Hash join 的執行計劃 ,先將兩張表上 的索引刪除,同時關閉并行,如下所示:

drop index idx_test_big1_id;drop index idx_test_small_id;explain analyze select test_small.name
from test_big1 join test_small
on test_big1.id = test_small.id and test_small.id < 100;

在這里插入圖片描述

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

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

相關文章

智能體賦能金融多模態報告自動化生成:技術原理與實現流程全解析

在金融領域&#xff0c;研報作為決策參考的核心載體&#xff0c;其生成過程往往涉及海量數據采集、多維度分析及專業內容整合&#xff0c;傳統人工制作模式不僅耗時耗力&#xff0c;還難以滿足實時性與標準化需求。隨著人工智能技術的發展&#xff0c;“智能體賦能的金融多模態…

uniapp和vue3項目中引入echarts 、lime-echart(微信小程序、H5等)

目錄標題1、獲取 lime-echart插件2、安裝 echarts3、相關代碼4、在線定制5、效果截圖1、獲取 lime-echart插件 https://gitee.com/liangei/lime-echart 將其中組件和靜態資源分別放入當前項目對應的文件夾中&#xff1a; 2、安裝 echarts npm install echarts --save具體查…

ZYNQ7020+AD9361裸機驅動驗證

1. 程序編譯驗證 a. 下載源代碼 首先需要從GitHub下載相應的源碼&#xff0c;打開git bash&#xff0c;然后在mingwin中使用以下命令下載源碼。 git clone --recursive https://github.com/MicroPhase/antsdr_standalone.git 注意&#xff1a;在下載源碼的時候&#xff0c;使…

Grafana配置連接時候證書與mongosqld啟動證書的關系

目錄 證書角色說明 1. BI Connector 端的證書 (--sslPEMKeyFile) 2. Grafana 端的證書 (TLS/SSL Client Certificate & Key) 它們之間的關系 配置建議 情況一&#xff1a;只需要服務器驗證&#xff08;最常見&#xff09; 情況二&#xff1a;需要雙向SSL認證&#x…

解決HTML/JS開發中的常見問題與實用資源

在前端開發過程中&#xff0c;即使是經驗豐富的開發者也會遇到各種小問題。本文將聚焦于兩個常見問題的解決方案&#xff0c;并推薦一些國內可訪問的優質源碼學習網站&#xff0c;幫助開發者提升效率。 一、字符編碼與亂碼問題解決 在HTML和JavaScript開發中&#xff0c;字符編…

SQLI-labs[Part 2]

本篇為SQLI-labs的Write-Up的第二部分包含Level 23- Level 27Level 23 過濾注釋符 字符注入拼接語句發現注釋符沒有生效 應該是被過濾了那只能通過拼接語句來除去后面的影響拼接?id1 or 11?id1%27%20or%20%271%27%271源碼中最后的導致語句閉合 Level 24 字符二次注入成功登錄…

宋紅康 JVM 筆記 Day17|垃圾回收器

一、今日視頻區間 P169-P203 二、一句話總結 GC分類與性能指標&#xff1b;不同的垃圾回收器概述&#xff1b;Serial回收器&#xff1a;串行回收&#xff1b;ParNew回收器&#xff1a;并行回收&#xff1b;Parallel回收器&#xff1a;吞吐量優先&#xff1b;CMS回收器&#xff…

[硬件電路-194]:NPN三極管、MOS-N, IGBT比較

NPN三極管、MOS-N&#xff08;N溝道MOS管&#xff09;和IGBT&#xff08;絕緣柵雙極型晶體管&#xff09;在電子電路設計中各有其獨特的應用場景和優勢&#xff0c;以下從工作原理、特性、應用領域三個維度進行比較&#xff1a;工作原理NPN三極管&#xff1a;結構&#xff1a;由…

【代碼隨想錄day 25】 力扣 46. 全排列

視頻講解&#xff1a;https://www.bilibili.com/video/BV19v4y1S79W/?vd_sourcea935eaede74a204ec74fd041b917810c 文檔講解&#xff1a;https://programmercarl.com/0046.%E5%85%A8%E6%8E%92%E5%88%97.html#%E6%80%9D%E8%B7%AF 力扣題目&#xff1a;https://leetcode.cn/prob…

指針(五)后半

1、 qsort 函數1.1、qsort 函數排列結構體在這里&#xff0c;我們創建結構體類型的數組&#xff0c;用于 qsort 函數的傳參。#include<stdio.h> #include<stdlib.h> #include<string.h>struct Stu//創建結構體變量 {char name[30];int age; };struct Stu arr…

TDengine 特殊選擇函數 MODE() 用戶手冊

MODE 函數用戶手冊 函數定義 MODE(expr)功能說明 MODE() 函數返回指定列中出現頻率最高的值&#xff08;眾數&#xff09;。如果有多個值具有相同的最高頻率&#xff0c;系統會返回其中一個值。該函數會忽略 NULL 值。 算法原理 MODE 函數的計算過程如下&#xff1a; 數據…

智能外骨骼技術應用場景及價格可接受區間分析

一、引言 智能外骨骼機器人融合機械、人工智能和傳感器技術,增強或恢復人體運動能力。2025年,該技術在醫療康復、工業生產、軍事應用和消費市場快速普及。本文分析其應用場景、市場需求、典型產品、價格可接受區間及相關來源,探討普及的關鍵因素。 二、主要應用場景及產品…

Vue模板中傳遞對象或數組時,避免直接使用字面量[]和{}

在 Vue 中&#xff0c;直接在模板中使用 [] 或 {} 作為 prop 值會導致子組件不必要的重新渲染&#xff0c;因為每次父組件渲染時都會創建新的引用。以下是解決方案和最佳實踐&#xff1a; 1. 避免在模板中直接使用字面量 <!-- 避免這樣寫 --> <ChildComponent :items&…

【C++】list容器的模擬實現

目錄 1. 節點(list_node) 的結構 2. 哨兵位頭節點 3. list容器的成員變量 4. 插入/刪除操作 4.1 插入操作&#xff08;insert&#xff09; 4.2 刪除操作&#xff08;erase&#xff09; 5. 迭代器的實現 6. 不同迭代器和const容器的限制 7. 重載operator-> 8. 迭代器…

三大運營商eSIM手機業務開通加速

截至2025年9月11日&#xff0c;中國三大運營商eSIM手機業務開通情況呈現明顯差異化&#xff1a;中國聯通已率先支持eSIM手機業務&#xff0c;但僅限于特定城市和設備&#xff1b;中國移動和中國電信則處于"技術準備就緒&#xff0c;等待政策批復"階段&#xff0c;預計…

基于SpringBoot的足球論壇系統+論文示例參考

1.項目介紹 系統角色&#xff1a;管理員、普通用戶功能模塊&#xff1a;用戶管理、足球賽事、球員信息、推薦話題、帖子信息、周邊商城、訂單信息、系統管理等技術選型&#xff1a;SpringBoot&#xff0c;Vue等 測試環境&#xff1a;idea2024&#xff0c;jdk1.8&#xff0c;mys…

數據庫中悲觀鎖小結

實際上&#xff0c;悲觀并發控制實際上是“先取鎖再訪問”的保守策略&#xff0c;為數據處理的安全提供了保證。但是在效率方面&#xff0c;處理加鎖的機制會讓數據庫產生額外的開銷&#xff0c;還有增加產生死鎖的機會&#xff1b;另外&#xff0c;在只讀型事務處理中由于不會…

結構光三維重建原理詳解(1)

1. 基本原理概述 結構光三維重建&#xff08;Structured Light 3D Reconstruction&#xff09;是一種主動式光學測量方法。其核心思想是&#xff1a; 向物體表面投射一組 已知的、編碼好的光柵/條紋圖案&#xff1b;使用一個或多個攝像機拍攝這些條紋在物體表面的變形情況&…

TruckSim與Matlab-Simulink聯合仿真(一)

摘要 從0到1的TruckSim與Matlab-Simulink 簡單的聯合仿真。 1. 環境搭建 matlab版本&#xff1a;R2022a TruckSim版本&#xff1a;2019 其他適配版本自行搜索。 matlabR2022a安裝參考&#xff1a;參考鏈接 TruckSim2019安裝包百度網盤鏈接&#xff0c;里面有安裝流程&#x…

后端post請求返回頁面,在另一個項目中請求過來會出現的問題

目錄 1.后端post請求返回頁面&#xff0c;跨域問題 一、核心問題&#xff1a;跨域&#xff08;CORS&#xff09;限制&#xff08;最直接的技術障礙&#xff09; 具體表現&#xff1a; 二、安全性問題&#xff1a;CSRF 攻擊風險被放大 原理與危害&#xff1a; 三、交互體驗…