PostgreSQL(二十六)分區表管理

目錄

一、分區表特點

1、概念:

2、好處:

3、特點:

二、范圍分區介紹

1、簡介

2、范圍分區實驗:

三、list分區介紹

1、簡介

2、list分區表實驗

四、hash分區介紹

1、簡介

2、hash分區表實驗

五、混合分區介紹

1、簡介

2、混合分區表實驗

六、總結


一、分區表特點

1、概念:

????????分區表的核心是分而治之。將表數據分成更小的物理分片,減少搜索范圍,以此可以查詢提高性能。

????????分區表是關系型數據庫中比較常見的對大表的優化方式,數據庫管理系統一般都提供了分區管理,而業務可以直接訪問分區表而不需要調整業務架構,當然好的性能需要合理的分區訪問方式。

2、好處:

(1)改善查詢性能

(2)增強可用性:單個小分區表損壞,不影響其他分區表的使用

(3)維護方便

(4)均衡I/O:PG的一個表只能放在一個表空間下,一個表空間只能在一個磁盤上。但是分區表是很多表,可以存儲到不同的磁盤上,以達到均衡I/O的目的

3、特點:

(1)pg數據庫表分區表的結構

由主表(父表)與分區表(子表)組成

主表是創建子表的模板,它是一個正常的普通表,正常情況下它并不儲存任何數據

分區表繼承并屬于一個主表,分區表中存儲所有的數據;

主表與分區表屬于一對多的關系,也就是說,一個主表包含多個分區表,而一個分區表只從屬于一個主表。

(2)官方聲明的分區實現方式

a.繼承分區:PG10版本以前都是用的繼承分區(后續版本也可使用),但是管理相對麻煩。創建主表、分區表之后,還要創建存儲過程、觸發器等。繼承分區的數據存儲是依靠觸發器,來把數據分發到不同的分區表內。

b.聲明式分區:也叫原生分區,從PG10版本開始支持,相當于"官方支持"的分區表,也是最為推薦的分區方式。雖然與繼承分區不一樣,但是其內部也是用繼承表實現的,只是不需要用戶手動干預,使用起來更方便。

聲明式分區支持:范圍分區,list分區,hash分區

本文章主要介紹這個分區方式。

c.第三方分區管理方式,比如pathman擴展等。

pathman可以讓分區表的管理更絲滑。例如:新插入的數據,其值不在分區表范圍內時,會插入失敗。但是使用pathman,會自動創建一個default分區,將不滿足分區范圍的數據插入到default分區中,避免插入失敗。

二、范圍分區介紹

1、簡介

范圍分區表一般指的一個分區的范圍,然后把滿足條件的行存放在該分區中。

最常見的是以日期做為分區條件,根據時間段分為不同的分區,存放不同時間段的數據。

2、范圍分區實驗:

# 創建主表
create table part_range(
order_id int,
name varchar(50)null,
saledate timestamp not null default now())
partition by range(saledate) ;# 在主表上創建一個主鍵約束后,子表上就會自動創建一樣的主鍵和索引
alter table part_range add primary key(order_id,saledate);\d+ part_range# 創建分區表(子表)
CREATE table p1_202401    //子表名字
PARTITION OF part_range     //基于(繼承)哪個主表
FOR values FROM ('2024-01-01 00:00:00') TO ('2024-02-01 00:00:00');    //分區范圍create table p1_202402 partition of part_range for values from ('2024-02-01 00:00:00') to ('2024-01 00:00:00:00');
create table p1_202403 partition of part_range for values from ('2024-03-01 00:00:00') to ('2024-04-01 00:00:00');
create table p1_202404 partition of part_range for values from ('2024-04-01 00:00:00') to ('2024-05-01 00:00:00');
create table p1_202405 partition of part_range for values from ('2024-05-01 00:00:00') to ('2024-06-01 00:00:00');
create table p1_202406 partition of part_range for values from ('2024-06-01 00:00:00') to ('2024-07-01 00:00:00');# 創建默認分區表,這樣有不屬于上面分區表的數據插入之后,就會進到默認表中
CREATE TABLE pn_default PARTITION OF part_range DEFAULT;     # 插入數據
insert into part_range select random()*10000,md5(g::text),g
from generate_series('2024-01-01'::date,'2024-06-30'::date,'1 minute') as g;# 查看數據
select tableoid::regclass,count(*)
from part_range 
group by tableoid::regclass;select tableoid::regclass,* from part_range limit 10;

Tip:在某些情況下,需要知道特定行來自哪個表,每個表中都有一個名為tableoid的系統列,使用regclass別名類型,它將象征性地打印表oid,可以列出行的原始表。

# 通過主表訪問分區表(強烈建議條件列是分區列,否則分區表無意義,數據庫會把所有分區表都遍歷一遍,大大降低性能)explain select * from part_range where saledate='2024-05-02';# 通過子表訪問(通過子表訪問時,如果訪問列不是分區列,但是索引列,也可以使用索引來提高一部分性能)
explain select * from p1_202401 where order_id=100;
explain select from p1_202401 where order_id=100;

三、list分區介紹

1、簡介

????????list分區以指定的分區值將數據存放到對應的分區上,然后把滿足條件的行存放在該分區中,最常見的是以某列值為分區條件,根據不同的列值存放在不同的分區。

2、list分區表實驗

# 創建主表
create table part_list(
city_id int not null,
name varchar(30),
population int)
partition by list(name) ;create index part_list_idx on part_list (name);    //list:分區方式;name:分區列\d+ part_list# 創建分區表
create table p1_list partition of part_list for values in ('fujian','zhejiang');
create table p2_list partition of part_list for values in ('shandong','jiangxi');# 插入數據
insert into part_list(city_id,name,population) values(1,'fujian',10);
insert into part_list(city_id,name,population) values(2,'zhejiang',20);
insert into part_list(city_id,name,population) values(3,'shandong',10);
insert into part_list(city_id,name,population) values(4,'jiangxi',30);# 查看數據
select tableoid::regclass,* from part_list;# 查看執行計劃
explain select * from part_list where name='fujian';

四、hash分區介紹

1、簡介

????????hash分區將數據散列存儲在各個分區上,以打散熱點數據存放到對應的分區上,然后把滿足條件的行存放在該分區中,最常見的是平均的把數據放在不同的分區。

2、hash分區表實驗

# 創建主表
create table part_hash
(order_id int,
name varchar(10))
partition by hash (order_id);create index part_hash_idx on part_hash (order_id);\d+ part_hash# 創建子表
create table p1_hash partition of part_hash for values with (modulus 3,remainder 0 );   //modules:除數;remainder:取模(余數)create table p2_hash partition of part_hash for values with (modulus 3,remainder 1);
create table p3_hash partition of part_hash for values with (modulus 3,remainder 2);# 插入數據
insert into part_hash values(generate_series(1,10000),'a');# 查詢數據
select tableoid::regclass,count(1) from part_hash group by tableoid::regclass;# 查看執行計劃
explain select * from part_hash where order_id=1000;

五、混合分區介紹

1、簡介

????????PG分區下面也可以建立子分區構成聯級模式,子分區可以有不同的分區方式,這樣的分區成為混合分區。

????????即:主表 --> 子表(分區表)--> 子分區? 的聯級關系。

????????當分區表的數據傾斜比較大時,就可以通過給大數據分區表創建子分區的方式平衡傾斜。

????????子分區的分區列可以和分區表的分區列一樣,也可以不一樣,在主表中指定子表的分區列,在子表中指定子分區的分區列。

????????例如下面這個例子,分區表以sale_date分區,子分區以category:

2、混合分區表實驗

1、創建主表
create table part_hunhe(
id int not null,
name varchar(20),
saledate timestamp)
partition by range(saledate) ;    //在主表指定,分區表使用哪一列進行分區。同樣的,應該在分區表指定,子分區表使用哪一列進行分區。\d+ part_hunhe# 創建分區表
create table part_2001 partition of part_hunhe for values from ('2023-01-01 00:00:00') to ('2023-02-01 00:00:00')
partition by list(name);     //在分區表創建時,指定子分區使用什么列進行分區create table part_2002 partition of part_hunhe for values from('2023-02-01 00:00:00') to ('2023-03-01 00:00:00')
partition by list(name);create table part_2003 partition of part_hunhe for values from('2023-03-01 00:00:00') to ('2023-04-01 00:00:00')
partition by list(name);create table part_2004 partition of part_hunhe for values from('2023-04-01 00:00:00') to ('2023-05-01 00:00:00')
partition by list(saledate);create table part_2005 partition of part_hunhe for values from('2023-05-01 00:00:00') to ('2023-06-01 00:00:00')
partition by range(saledate);\d+ part_2001# 創建子分區表
create table part_3001 partition of part_2001 for values in ('abc');
create table part_3002 partition of part_2001 for values in ('def');
create table part_3003 partition of part_2001 for values in ('jkl');
create table part_3004 partition of part_2004 for values in ('2023-04-01 00:00:00');
create table part_3005 partition of part_2005 for values from ('2023-05-01 00:00:00') to ('2023-05-10 00:00:00');\d+ part_3001# 插入數據
insert into part_hunhe values(random()*10000,'abc','2023-01-01 08:00:00');
insert into part_hunhe values(random()*10000,'def','2023-01-01 08:00:00');# 查詢數據
select tableoid::regclass,* from part_hunhe;# 查看執行計劃
explain select * from part_hunhe where name='adc';

?

六、總結

1、pg不支持interval分區,沒有自帶的自動新增分區功能

2、分區表的分區本身也是表,主表不存儲數據,分區表存儲數據

3、truncate、vacuum、analyze主表會執行所有分區。truncateonly不能在主表上執行,但可以在存數據的分區表上執行,僅清除這個分區表

4、range、hash分區的分區鍵可以有多個列,list分區鍵只能是單個列或表達式

5、default分區表會接收不在聲明的范圍中的數據;如果沒有default分區,插入范圍外的數據會直接報錯

//創建default子表:CREATE TABLE tbl_name_default PARTITION OF tbl_log DEFAULT;

6、如果要新增分區,需要注意default分區中是否有這個新增分區的數據,如果有,則會發生沖突導致報錯(不會自動遷移過去)。

7、partition of創建的分區會自動創建主表上定義的索引、約束、行級觸發器

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

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

相關文章

概率論中的生日問題,違背直覺?如何計算? 以及從人性金融的角度分析如何違背直覺的?

一、生日問題的概率計算:為何23人就有50%概率撞生日? 1. 問題背景與直覺矛盾 生日問題指:在n個人中,至少有兩人生日相同的概率超過50%時,n的最小值是多少? 直覺判斷:因一年有365天&#xff0c…

Qt for WebAssembly官方說明文檔

鏈接 Qt for WebAssembly | Qt 5.15

前端自主實現將vue頁面轉為pdf文件下載

1.vue 轉 PDF 在 Vue 項目中將 HTML 頁面轉換為 PDF 文件是一個常見需求,特別是在需要生成報告或打印頁面時。本文將介紹如何使用 html2canvas 和 jspdf 庫實現這一功能。 2.安裝依賴 首先,我們需要安裝兩個庫:html2canvas 和 jspdf 。可以…

TCP 堅持定時器詳解:原理、配置與最佳實踐?

一、TCP 堅持定時器基礎原理 1.1 堅持定時器的設計目的 TCP 堅持定時器 (TCP Persist Timer) 是 TCP 協議中用于處理接收窗口為零情況的重要機制,其核心設計目的是防止 TCP 連接在窗口更新 ACK 丟失時陷入死鎖狀態。當 TCP 連接的接收方通告一個窗口大小為 0 的 A…

大廠測開實習和小廠開發實習怎么選

先說選擇,這個可以百分百確定選大廠,title很重要。 要想弄清楚那個選擇對自己最有利,可以思考下實習的意義是什么? 實習無非就是給簡歷加分,拿到好offer,高薪offer。 那這就需要思考,簡歷怎么讓…

Unity中的urp和普通的標準渲染管線區別在哪

Unity中的URP(Universal Render Pipeline)與內置標準渲染管線(Built-in Render Pipeline)的區別深刻反映了Unity渲染技術的演進方向。以下從架構、性能、功能、工作流等多個維度進行深度分析: 1. 底層架構與設計哲學 標…

Vscode 編寫Markdown支持 plantuml書寫

1: 下載PlantUml 插件: 2: 安裝java https://www.oracle.com/java/technologies/downloads/ 3: 安裝Graphviz https://graphviz.org/download/ 4: 下載plantuml.jar https://plantuml.com/zh/download 5&…

設計模式(C++/Qt)-工廠模式

在軟件開發中,對象創建是基礎但關鍵的任務——工廠模式提供了一種優雅的解決方案,讓您的代碼擺脫硬編碼的依賴關系 一、為什么需要工廠模式? 在C/Qt開發中,我們經常面臨這樣的困境: 對象創建邏輯分散在代碼各處新增…

Pydantic 模型

本文將詳細介紹 Pydantic 模型 和 BaseModel 的核心概念,并通過實際代碼示例如何從零開始編寫自己的 Pydantic 模型。 1. Pydantic 是什么? Pydantic 是一個 Python 庫,主要用于: 數據驗證:確保輸入數據符合預期的類…

【Unity智能模型系列】MediaPipeUnityPlugin 實現人臉數據獲取

目錄 一、MediaPipeUnity 簡介 二、MediaPipeUnity 的核心組成 1. Graph 構建系統 2. 解決方案類(Solution) 3. 解釋注釋Annotation 系統 三、MediaPipeUnity 的典型使用流程 四、典型示例解析 1、案例 Face Detection圖形人臉檢測 2、案例 Face Detection圖形人臉檢…

iOS App 上架步驟解析:適合資源有限團隊的上架流程與注意事項

對于不少創業型或初創階段的開發團隊來說,人員配置緊湊、設備有限是常態。在這種背景下,完成一次合規、高效的iOS應用發布往往不是技術難點,而是流程協同與資源調配的問題。 我們是一支5人團隊,開發一款社交類工具型App&#xff…

Redis雪崩、穿透、擊穿原理及解決方案

以下是 Redis 緩存穿透、擊穿與雪崩的原理及解決方案的深度解析,結合工業級實踐整理: 🔍 ?一、問題原理與區別? ?問題類型??觸發條件??核心特征??危害??緩存穿透?查詢?不存在的數據?繞過緩存直擊數據庫,導致無效查…

DFX 動態重構的概念和實現

DFX 動態重構的概念和實現 背景介紹 本文內容當前僅限于XILINX或者和XILINX具有相同結構的FPGA器件。 FPGA 技術提供了在現場進行編程和重新編程的靈活性,而無需通過重新制造流程來實現設計修改。動態功能交換(Dynamic Function eXchange, DFX&#x…

hutool 導出數據報錯:org.apache.poi.openxml4j.exceptions.OpenXML4JRuntimeException

Excel 導出報錯 org.apache.poi.openxml4j.exceptions.OpenXML4JRuntimeException: Fail to save: an error occurs while saving the package : The part /docProps/core.xml failed to be saved in the stream with marshaller org.apache.poi.openxml4j.opc.internal.marsh…

【學習】win 本地部署qwen3

這里寫自定義目錄標題 環境搭建下載Ollama安裝olama修改模型下載位置(可以不設置)通過ollama下載/啟動模型常用命令其他 環境搭建 下載Ollama 安裝olama 默認安裝位置是c盤 安裝到指定位置使用以下命令 OllamaSetup.exe /DIR"d:\Ollama"修改…

python的__init__.py

在此之前先確認一個概念是否弄清 模塊命名空間 1. 目錄結構 假設你有以下結構: testpkg/__init__.pyfool.pymaybe.py內容如下: fool.py # testpkg/fool.py class Fool:passmaybe.py # testpkg/maybe.py class Maybe:pass__init__.py &#xff08…

四核 A53+工業級存儲:移遠 SC200L 與 pSLC SD NAND 如何重構 T-BOX 性能邊界?

博客目錄 一、移遠 SC200L:T-BOX 的 “智慧大腦”二、米客方德 MKDN064GIL-ZA T-BOX:數據安全的堅固堡壘三、深度協同:拓展 T-BOX 應用邊界 在車聯網浪潮席卷而來的當下,T-BOX 作為汽車與外界交互的核心樞紐,其性能優劣…

JavaEE-統一功能處理

攔截器 實現強制登錄的功能, 后端程序根據Session來判斷??是否登錄, 但是實現?法是?較?煩的 需要修改每個接?的處理邏輯 需要修改每個接?的返回結果 接?定義修改, 前端代碼也需要跟著修改 有沒有更簡單的辦法, 統?攔截所有的請求, 并進?Session校驗呢, 這?我們學…

vscode運行c++文件和插件的方法

1.運行c文件全過程 VSCode運行C全教程-CSDN博客 按照以上的操作即可完成正常的配置流程。但是在運行我的文件時,總是出現終端和輸出混亂的情況,我想要在終端中進行輸入輸出的話,需要加一個改動:設置--輸入Run In Terminal--勾選…

利用云效實現自動化部署gitee倉庫中的項目

本文主要介紹如何利用云效 實現Node項目(vue/react....)自動化部署 1.準備工作 Git 倉庫【Gitee】 云服務器【華為云】 你的項目 2. 創建目錄 服務器上創建兩個目錄 一個專門用來放壓縮包: /home/www/dist (aaa.tgz bbb.tgz&am…