PostgreSQL 分區表一點也不差(轉發)


原文:

https://cloud.tencent.com/developer/article/1462140

MYSQL 在分區表上的缺失不同,POSTGRESQL 的分區表那算是“硬可”。PG11 已經推出了HASH 分區。具體操作是怎樣

首先分區表的大致用途有那些

1 在符合業務的基礎上,能對合理的預設的查詢提高查詢的速度

2 在符合業務的基礎上,能對數據的插入降低熱點塊的競爭,提高插入速度

3 在某些場合合理的訪問分區可能順序的掃描分區內的數據比使用分區內的索引更能提高數據訪問的性能。

4 合理的設置分區,會更方便處理無用的數據,統一將一個分區內的數據進行處理。

 

目前 POSTGRESQL 支持的分區方式有

1 Range Partitiioning

2 List Partitioning

3 Hash Partitioning

與ORACLE 差不多的是,每個分區也是可以有自己的子分區的索引,默認值,或者一些其他定義。

另外一件事情是分區這個事情是需要有預先的設計的,而不是在系統的數據庫表已經運行了好長一段時間后,在去做分區表。所以在系統設計之初就做好設計工作是重要的。

 

下面我們就來做點什么

1 HASH Partitioning 這是在 PG 11 中的新功能 ,通過HASH partitioning 可以加速數據的插入,這也是ORACLE DBA 引以為豪的傲嬌點。

下面建立一個HASH分區表,這里已BIGINT 為主鍵,插入的主鍵除以10后余數來選擇記錄的落點。

后面直接插入20萬數據不到1 秒就完成了

 

我們來看看插入的數據,基本上都打散了。

查詢也是沒有問題,走了主鍵的索引

 

 

而清除一個分區表的數據也很簡單,直接刪除那個表就可以了

如果想繼續恢復那個分區也是很容易的事情

當然如果你想保留數據分區表的部分數據,但又不想他成為分區表中的一員也很簡單。

同時PostgreSQL 也同樣支持range 分區的類型,通過range 類型的分區可以根據已經設計好的日期,或者其他表中的行數據進行划分,進行分區表存儲。

廢話不說,建立相關的表和分區表

在建立日期類型的分區表中,要注意到to 是不包含后面指定的時間段,如果設置成 from ('2008-01-01') to ('2008-12-31') 下一個range 設置成 from ('2019-01-01') to ('2019-12-31') 則在插入數據的時候會報

no partition of relation found for row

的問題。

 

 

另一個問題是,建立分區表的時候(Postgresql 不建議建立主鍵,這樣會引起以后必要的麻煩,如果需要可以建立唯一索引)

創建一個存儲過程來進行數據的插入,看看分區表是否有問題

create or replace procedure insert_data()

language plpgsql

as $$

declare

date_value timestamp;

declare id int;

begin

date_value := '2007-01-01 00:00:00'::timestamp + '1 hour';

id = 1;

while id < 400000 loop

insert into range_test (password,insert_date) (select id::char(48),date_value::timestamp);

id = id + 1;

date_value := date_value::timestamp + '1 hour';

end loop;

end;

$$;

 

 

通過圖中的兩條語句來進行數據的驗證,沒有問題。

根據查詢的要求我們還可以建立相關的分區索引

 

 

當然如果全表查詢,也可以走全局的索引

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM