PostgreSQL17索引優化之支持并行創建BRIN索引

PostgreSQL17索引優化之支持并行創建BRIN索引

最近連續寫了幾篇關于PostgreSQL17優化器改進的文章,其實感覺還是挺有壓力的。對于原理性的知識點,一方面是對這些新功能也不熟悉,為了盡可能對于知識點表述或總結做到準確,因此需要去閱讀官網的討論郵件及源碼;另外對于知識點,如何快速的把自己寫文章的本意,很清晰的表達清楚,也在不斷調整寫作方式。希望不會對大家的閱讀造成困擾,也希望大家有所收獲。

關于PostgreSQL17索引優化之支持并行創建BRIN索引這個主題,相對來說更傾向于實操類型的,對于底層具體是如何實現的,其實對于大部分人來說應該是不太關注。下面我們直接進入正題,直接實操驗證該功能。

創建測試用例表并插入數據

CREATE TABLE brin_parallel_test (a int, b text, c bigint) WITH (fillfactor=40);
--生成的數據中需要有null或非null的值
INSERT INTO brin_parallel_test
SELECT (CASE WHEN (mod(i,231) = 0)  THEN NULL ELSE i END),(CASE WHEN (mod(i,233) = 0) THEN NULL ELSE md5(i::text) END),(CASE WHEN (mod(i,233) = 0)  THEN NULL ELSE (i/100) + mod(i,8) END)FROM generate_series(1,50000000) S(i);

串行創建BRIN索引

查看max_parallel_maintenance_workers默認參數值

查看max_parallel_maintenance_workers,該參數設置單一工具性命令能夠啟動的并行工作者的最大數目。默認值2,表示條件允許,可以啟動兩個工作程序來幫助創建索引。

testdb=# show max_parallel_maintenance_workers;max_parallel_maintenance_workers 
----------------------------------2
(1 row)

設置max_parallel_maintenance_workers值

為了確保不會選擇多核創建索引,在這里將max_parallel_maintenance_workers設置為0

SET max_parallel_maintenance_workers = 0;

創建BRIN索引

 CREATE INDEX brin_test_serial_idx ON brin_parallel_testUSING brin (a int4_minmax_ops, a int4_bloom_ops, b, c int8_minmax_multi_ops)WITH (pages_per_range=7);
CREATE INDEX
Time: 52435.488 ms (00:52.435)

在這里插入圖片描述

并行創建BRIN索引

設置并行參數及maintenance_work_mem

SET min_parallel_table_scan_size = 0;
SET max_parallel_maintenance_workers = 4;
SET maintenance_work_mem = '128MB';

創建BRIN索引

 CREATE INDEX brin_test_parallel_idx ON brin_parallel_testUSING brin (a int4_minmax_ops, a int4_bloom_ops, b, c int8_minmax_multi_ops)WITH (pages_per_range=7);
CREATE INDEX
Time: 12246.050 ms (00:12.246)

在這里插入圖片描述

對比串行和并行串行索引是否一致

SELECT relname, relpagesFROM pg_classWHERE relname IN ('brin_test_serial_idx', 'brin_test_parallel_idx')ORDER BY relname;relname         | relpages 
------------------------+----------brin_test_parallel_idx |        3brin_test_serial_idx   |        3
(2 rows)
--檢查(A except B)和(B except A)是否為空,如果為空,這意味著索引是相同的。
SELECT * FROM brin_page_items(get_raw_page('brin_test_parallel_idx', 2), 'brin_test_parallel_idx')
EXCEPT
SELECT * FROM brin_page_items(get_raw_page('brin_test_serial_idx', 2), 'brin_test_serial_idx');SELECT * FROM brin_page_items(get_raw_page('brin_test_serial_idx', 2), 'brin_test_serial_idx')
EXCEPT
SELECT * FROM brin_page_items(get_raw_page('brin_test_parallel_idx', 2), 'brin_test_parallel_idx');

從這里我們可以看出,對于串行和并行創建的索引,其結果是一致的。

總結

從上述的驗證,在串行創建BRIN索引,耗時52.435s,并行創建BRIN索引,耗時12.246s,性能大幅提升。對于并行創建BRIN索引,當max_parallel_maintenance_workers為4時,通過觀察后臺的進程,是由一個主進程和3個輔助進程來創建索引的。

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

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

相關文章

華為認證試題有題庫嗎?華為認證題庫怎么領取?

在競爭激烈的就業環境下,若你擁有華為認證將可以提高個人綜合能力,更好的適應行業變化。相信大家都有聽說過想考取華為初級認證并不困難,因為它有專門的題庫供考生備考。 那么,到底華為認證試題有題庫嗎?華為認證題庫要怎么領取…

java并發編程之美-第1章 并發編程線程基礎-線程的創建與運行

文章目錄 1.什么是線程2. 線程創建和運行 1.什么是線程 進程是操作系統進行資源分配和調度的基本單位,線程是 CPU 分配的基本單位。 程序計數器用來記錄線程當前要執行的指令地址。CPU一般是使用時間片輪轉方式讓線程輪詢占用的,程序計數器是記錄線程…

【Django】報錯‘staticfiles‘ is not a registered tag library

錯誤截圖 錯誤原因總結 在django3.x版本中staticfiles被static替換了,所以這地方換位static即可完美運行 錯誤解決

callBack方式實現threejs點擊事件Raycaster

我用的的示例類發方式來初始化場景。 類里面定義點擊方法。 initMouse(fun) {window.addEventListener("click", (event) > {this.clickObject(event, fun);});}// 鼠標事件clickObject(event, fun) {// 計算點擊位置的歸一化設備坐標const mouse new THREE.Ve…

IO模型理論學習

1、什么是IO 計算機視角下的io AIO

“泰迪·曲靖師范學院數學與統計學院數據科學教學實訓平臺”工作室簽約揭牌儀式圓滿結束

為深化校企合作,實現應用型人才培養目標。泰迪智能科技攜手曲靖師范學院數學與統計學院共建“數據科學教學實訓平臺工作室”。 2024年7月10日,“?泰迪數學與統計學院數據科學教學實訓平臺”工作室揭牌儀式在曲靖師范學院舉行。泰迪智能科技昆明分公司院…

LPRNet 車牌識別部署 rk3588(pt-onnx-rknn)包含各個步驟完整板端代碼

雖然車牌識別技術很成熟了,但完全沒有接觸過。一直想搞一下、整一下、試一下、折騰一下,工作之余找了一個簡單的例子入個門。本博客簡單記錄一下 LPRNet 車牌識別部署 rk3588流程,訓練參考 LPRNet 官方代碼。 1、導出onnx ??導出onnx很容易…

EtherCAT設備配置:SCI EoeMacIp 文件與實際設備配置的比較過程

標題:EtherCAT設備配置:SCI文件與實際設備配置的比較過程 在工業自動化領域,EtherCAT(Ethernet for Control Automation Technology)作為一種高效的實時以太網協議,正在被廣泛應用。在EtherCAT網絡的配置過…

SW - 將面導出為dxf

文章目錄 SW - 將面導出為dxf概述筆記原點問題END SW - 將面導出為dxf 概述 在做PCB板框. 以前做過一個筆記,用autoCAD來制作導出dxf(cadence SPB17.4 - 用autoCAD2022畫一個PCB板框)。 不喜歡用autoCAD(相對麻煩), 還是喜歡用SW&#xff0…

異步日志:性能優化的金鑰匙

一、背景 2024 年 4 月的一個寧靜的夜晚,正當大家忙完一天的工作準備休息時,應急群里“咚咚咚”開始報警,提示我們余利寶業務的贖回接口成功率下降。 通過 Monitor 監控發現,該接口的耗時已經超過了網關配置的超時閾值(2s)&#…

Spring Cloud Alibaba整合Seata實戰

Spring Cloud Alibaba整合Seata實戰 1.啟動Seata Server 1.1 環境準備 1)指定nacos作為配置中心和注冊中心 修改registry.conf文件 注意:客戶端配置registry.conf使用nacos時也要注意group要和seata server中的group一致,默認group是&quo…

我的PHP8編譯日志

編譯命令在arm和x86架構上是一樣的,如果缺少依賴庫,按需要安裝: 登錄后復制 yuminstall libcurl libcurl-devel yum install openssl openssl-devel yum install pcre2 pcre2-devel yum install libxml2 libxml2-devel 1.2.3.4. 配置和編譯&…

Linux--生產消費模型

線程系列: Linux–線程的認識(一) Linux–線程的分離、線程庫的地址關系的理解、線程的簡單封裝(二) 線程的互斥:臨界資源只能在同一時間被一個線程使用 生產消費模型 生產消費模型是多線程編程和分布式系統中的一個經典概念&…

我們水冷使制動電阻功率密度成倍增加-水冷電阻設計工廠

先進陶瓷 我們后來發現工業應用中對占用空間最小的水冷電阻器的工業需求,推出了適用于中壓工業應用的水冷電阻器。它的特點是兩塊由具有特殊性能的先進陶瓷制成的板。 使用工業電驅動裝置的一個重要好處是,可靠的再生和動態制動系統可以補充或取代傳統…

Llama2 訓練指南

Llama2 是一個基于 Python 的機器學習框架,旨在幫助開發者快速構建和部署機器學習模型。下面是 Llama2 訓練指南,旨在幫助您了解如何使用 Llama2 訓練模型。 概述 Llama2 提供了多種方式來訓練模型,包括使用 Keras 和 TensorFlow。下面是在…

Laravel :如何將Excel文件導入數據庫

文章目錄 一、前提二、使用2.1、新建一個導入文件2.2、新建一個控制器和方法,調用導入文件2.3、 新建一個頁面,支持文件上傳 一、前提 想要將excel內容入庫,laravel有擴展可以使用,常用的擴展是maatwebsite/excel,安裝步驟參考上一篇&#x…

力扣 202快樂數

快樂數這題有兩個關鍵 一個是求n的 各個位上平方和 另一個是判斷是否為快樂數的依據是是否在哈希表中找到已經出現過的數 1求各個位上平方和方法 定義sum sum N除以十取余的平方和 n/10 循環終止條件是n0 2查找一個數是否出現,用哈希表unordered_set &…

Mosh|SQL教程第四彈(未完)

SQL有很多自帶的內聚的函數(MAX、MIN、AVG、SUM、COUNT) 一、聚合函數(Aggregate Functions) 這里的括號可以寫列名也可以寫表達式,下面是一個練習: 二、GROUP BY子句 統計2019-07-01以后每個客戶的總銷售額 注意這…

result.h

#ifndef ASYNCIO_RESULT_H #define ASYNCIO_RESULT_H#include <asyncio/exception.h> #include <variant> #include <optional> namespace ASYNCIO_NS {// 結果類封裝&#xff08;不是協程函數的返回類型&#xff09; template<typename T> struct Res…

Javaweb11-Filter過濾器

Filter過濾器 1.Filter的基本概念&#xff1a; 在Java Servlet中&#xff0c;Filter接口是用來處理HttpServletRequest和HttpServletResponse的對象的過濾器。主要用途是在請求到達Servlet之前或者響應離開Servlet之前對請求或響應進行預處理或后處理。 2.Filter常見的API F…