亚洲综合原千岁中文字幕_国产精品99久久久久久久vr_无码人妻aⅴ一区二区三区浪潮_成人h动漫精品一区二区三

主頁 > 知識庫 > PostgreSQL LIST、RANGE 表分區的實現方案

PostgreSQL LIST、RANGE 表分區的實現方案

熱門標簽:合肥公司外呼系統運營商 漯河外呼電話系統 外呼調研系統 打電話智能電銷機器人授權 美容工作室地圖標注 地圖標注和圖片名稱的區別 重慶自動外呼系統定制 辦公外呼電話系統 海豐有多少商家沒有地圖標注

簡 介

PG分區:就是把邏輯上的一個大表分割成物理上的幾塊。

分區的優點

1. 某些類型的查詢性能得到提升

2. 更新的性能也可以得到提升,因為某塊的索引要比在整個數據集上的索引要小。

3. 批量刪除可以通過簡單的刪除某個分區來實現。

4. 可以將很少用的數據移動到便宜的、轉速慢的存儲介質上。

分區實現原理

10.x版本之前PG表分區的實現原理:PG中是通過表的繼承來實現的,建立一個主表,里面是空的,然后每個分區去繼承它。無論何時,該主表里面都必須是空的

官網建議:只有當表本身大小超過了機器物理內存的實際大小時,才考慮分區。

原分區用法

以繼承表的方式實現:

create table tbl( a int, b varchar(10) ); 
create table tbl_1 ( check ( a = 1000 ) ) INHERITS (tbl); 
create table tbl_2 ( check ( a = 10000 and a >1000 ) ) INHERITS (tbl);
create table tbl_3 ( check ( a = 100000 and a >10000 ) ) INHERITS (tbl);

再通過創建觸發器或者規則,實現數據分發,只需要向子表插入數據則會自動分配到子表中

CREATE OR REPLACE FUNCTION tbl_part_tg() 
RETURNS TRIGGER AS $$ 
BEGIN 
 IF ( NEW. a = 1000 ) THEN 
 INSERT INTO tbl_1 VALUES (NEW.*); 
 ELSIF ( NEW. a > 1000 and NEW.a = 10000 ) THEN 
 INSERT INTO tbl_2 VALUES (NEW.*); 
 ELSIF ( NEW. a > 10000 and NEW.a = 100000 ) THEN 
 INSERT INTO tbl_3 VALUES (NEW.*); 
 ELSIF ( NEW. a > 100000 and NEW.a = 1000000 ) THEN 
 INSERT INTO tbl_4 VALUES (NEW.*); 
 ELSE RAISE EXCEPTION 'data out of range!'; 
 END IF;
 RETURN NULL; 
END;
 $$ 
LANGUAGE plpgsql; 
CREATE TRIGGER insert_tbl_part_tg
  BEFORE INSERT ON tbl 
FOR EACH ROW EXECUTE PROCEDURE tbl_part_tg();

分區創建成功

如何實現分區過濾?

對于分區表來說,如果有50個分區表,對于某個條件的值如果能確定,那么很可能直接過濾掉49個分區,大大提高掃描速度,當然分區表也能放在不同的物理盤上,提高IO速度。

對于查詢是怎么實現分區表過濾呢?

約束排除 是否使用約束排除通過postgresql.conf中參數constraint_exclusion 來控制,

只有三個值

 constraint_exclusion = on

on:所有情況都會進行約束排除檢查

off:關閉,所有約束都不生效

partition:對分區表或者繼承表進行約束排查,默認為partition

如:

select *from tbl where a = 12345;

首先找到主表tbl,然后通過tbl找到它的子表,找到后再對再拿著謂詞條件a = 12345對一個個子表約束進行檢查,不符合條件表就去掉不掃描,實現分區表過濾,下面簡單介紹下約束排除源碼邏輯。

如何實現數據分發?

基于規則的話,會在查詢重寫階段按時替換規則生成新的插入語句,基于觸發器會在insert主表前觸發另外一個insert操作,這兩個邏輯都比較簡單,相關代碼不再介紹。

錯誤描述:在新建分區主表時提示以下錯誤信息

錯誤原因:在本地postgresql.conf 配置了 search_path = ‘$user' ,所以在使用的時候需要先創建當前用戶對應的schema,如果不存在,則會提示錯誤

解決方法:在創建表時指定創建的schemal,即可成功。

PostgreSQL 10.x LIST分區方案

postgres=# CREATE TABLE list_parted (
postgres(# a int
postgres(# ) PARTITION BY LIST (a);
CREATE TABLE
postgres=# CREATE TABLE part_1 PARTITION OF list_parted FOR VALUES IN (1);
CREATE TABLE
postgres=# CREATE TABLE part_2 PARTITION OF list_parted FOR VALUES IN (2);
CREATE TABLE
postgres=# CREATE TABLE part_3 PARTITION OF list_parted FOR VALUES IN (3);
CREATE TABLE
postgres=# CREATE TABLE part_4 PARTITION OF list_parted FOR VALUES IN (4);
CREATE TABLE
postgres=# CREATE TABLE part_5 PARTITION OF list_parted FOR VALUES IN (5);
CREATE TABLE
postgres=#
postgres=# insert into list_parted values(32); --faled
ERROR: no partition of relation "list_parted" found for row
DETAIL: Failing row contains (32).
postgres=# insert into part_1 values(1);
INSERT 0 1
postgres=# insert into part_1 values(2);--faled
ERROR: new row for relation "part_1" violates partition constraint
DETAIL: Failing row contains (2).
postgres=# explain select *from list_parted where a =1;
       QUERY PLAN
-----------------------------------------------------------------
 Append (cost=0.00..41.88 rows=14 width=4)
 -> Seq Scan on list_parted (cost=0.00..0.00 rows=1 width=4)
   Filter: (a = 1)
 -> Seq Scan on part_1 (cost=0.00..41.88 rows=13 width=4)
   Filter: (a = 1)
(5 rows)

上面是LIST分區表,建表是先建主表,再建子表,子表以 PARTITION OF 方式說明和主表關系,約束條件應該就是后面的in里面。

Explain 執行sql解析計劃

cost:數據庫自定義的消耗單位,通過統計信息來估計SQL消耗。(查詢分析是根據analyze的固執生成的,生成之后按照這個查詢計劃執行,執行過程中analyze是不會變的。所以如果估值和真是情況差別較大,就會影響查詢計劃的生成。)

rows:根據統計信息估計SQL返回結果集的行數。

width:返回結果集每一行的長度,這個長度值是根據pg_statistic表中的統計信息來計算的。

PostgreSQL 10.x RANGE分區

創建RANGE分區

postgres=# CREATE TABLE range_parted (
postgres(# a int
postgres(# ) PARTITION BY RANGE (a);
CREATE TABLE
postgres=# CREATE TABLE range_parted1 PARTITION OF range_parted FOR VALUES from (1) TO (1000);
CREATE TABLE
postgres=# CREATE TABLE range_parted2 PARTITION OF range_parted FOR VALUES FROM (1000) TO (10000);
CREATE TABLE
postgres=# CREATE TABLE range_parted3 PARTITION OF range_parted FOR VALUES FROM (10000) TO (100000);
CREATE TABLE
postgres=#
postgres=# insert into range_parted1 values(343);
INSERT 0 1
postgres=#
postgres=# explain select *from range_parted where a=32425;
        QUERY PLAN
---------------------------------------------------------------------
 Append (cost=0.00..41.88 rows=14 width=4)
 -> Seq Scan on range_parted (cost=0.00..0.00 rows=1 width=4)
   Filter: (a = 32425)
 -> Seq Scan on range_parted3 (cost=0.00..41.88 rows=13 width=4)
   Filter: (a = 32425)
(5 rows)
postgres=# set constraint_exclusion = off;
SET
postgres=# explain select *from range_parted where a=32425;
        QUERY PLAN
---------------------------------------------------------------------
 Append (cost=0.00..125.63 rows=40 width=4)
 -> Seq Scan on range_parted (cost=0.00..0.00 rows=1 width=4)
   Filter: (a = 32425)
 -> Seq Scan on range_parted1 (cost=0.00..41.88 rows=13 width=4)
   Filter: (a = 32425)
 -> Seq Scan on range_parted2 (cost=0.00..41.88 rows=13 width=4)
   Filter: (a = 32425)
 -> Seq Scan on range_parted3 (cost=0.00..41.88 rows=13 width=4)
   Filter: (a = 32425)
(9 rows)

上述操作中的 a的取值范圍為【0,1000)即插入值若為1000邊界值,則會保存在第二個分區表中和LIST差不多,就是語法略有不同,范圍表值是一個連續的范圍,LIST表是單點或多點的集合。

從上面例子可以看到,顯然還是走的約束排除過濾子表的方式。

constraint_exclusion = “on ,off,partition ”; 該參數為postgresql.conf中的參數

on 表示所有的查詢都會執行約束排除

off 關閉,所有的查詢都不會執行約束排除

partition :表示只對分區的表進行約束排除

分區列的類型必須支持btree索引接口(幾乎涵蓋所有類型, 后面會說到檢查方法)。

更新后的數據如果超出了所在分區的范圍,則會報錯

PostgreSQL 分區注意事項

語法

1、創建主表

[ PARTITION BY { RANGE | LIST } ( { column_name | ( expression ) } [ COLLATE collation ] [ opclass ] [, ... ] ) ] 

2、創建分區

PARTITION OF parent_table [ ( 
 { column_name [ column_constraint [ ... ] ] 
 | table_constraint } 
 [, ... ] 
) ] FOR VALUES partition_bound_spec 
and partition_bound_spec is: 
{ IN ( expression [, ...] ) -- list分區 
 | 
 FROM ( { expression | UNBOUNDED } [, ...] ) TO ( { expression | UNBOUNDED } [, ...] ) } -- range分區, unbounded表示無限小或無限大

語法解釋

partition by 指定分區表的類型range或list指定分區列,或表達式作為分區鍵。

range分區表鍵:支持指定多列、或多表達式,支持混合(鍵,非表達式中的列,會自動添加not null的約束)

list分區表鍵:支持單個列、或單個表達式

分區鍵必須有對應的btree索引方法的ops(可以查看系統表得到)

select typname from pg_type where oid in (select opcintype from pg_opclass); 

主表不會有任何數據,數據會根據分區規則進入對應的分區表

如果插入數據時,分區鍵的值沒有匹配的分區,會報錯

不支持全局的unique, primary key, exclude, foreign key約束,只能在對應的分區建立這些約束

分區表和主表的 列數量,定義 必須完全一致,(包括OID也必須一致,要么都有,要么都沒有)

可以為分區表的列單獨增加Default值,或約束。

用戶還可以對分區表增加表級約束

如果新增的分區表check約束,名字與主表的約束名一致,則約束內容必須與主表一致

當用戶往主表插入數據庫時,記錄被自動路由到對應的分區,如果沒有合適的分區,則報錯

如果更新數據,并且更新后的KEY導致數據需要移動到另一分區,則會報錯,(意思是分區鍵 可以更新,但是不支持更新后的數據移出到別的分區表)

修改主表的字段名,字段類型時,會自動同時修改所有的分區

TRUNCATE 主表時,會清除所有繼承表分區的記錄(如果有多級分區,則會一直清除到所有的直接和間接繼承的分區)

如果要清除單個分區,請對分區進行操作

如果要刪除分區表,可以使用DROP TABLE的DDL語句,注意這個操作會對主表也加access exclusive lock。

補充:對PostgreSQL語法分析中 targetlist 的理解

在 gram.y 中:

simple_select:                
      SELECT  opt_distinct  target_list          
      into_clause   from_clause   where_clause          
      group_clause   having_clause  window_clause          
        {        
          SelectStmt *n = makeNode(SelectStmt);      
          n->distinctClause = $2;      
          n->targetList = $3;      
          n->intoClause = $4;      
          n->fromClause = $5;      
          n->whereClause = $6;      
          n->groupClause = $7;      
          n->havingClause = $8;      
          n->windowClause = $9;      
          $$ = (Node *)n;      
        }        
……   

把它修改一下,增加:

simple_select:                
      SELECT  opt_distinct  target_list          
      into_clause   from_clause   where_clause          
      group_clause   having_clause  window_clause          
        {        
          SelectStmt *n = makeNode(SelectStmt);      
          n->distinctClause = $2;      
          n->targetList = $3;      
          n->intoClause = $4;      
          n->fromClause = $5;      
          n->whereClause = $6;      
          n->groupClause = $7;      
          n->havingClause = $8;      
          n->windowClause = $9;      
          $$ = (Node *)n;
          fprintf(stderr,"length of list: %d\n", n->targetList->length);      
        }      
……    

psql 中執行:

select id, name from a8;

后臺出現:

length of list: 2

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。如有錯誤或未考慮完全的地方,望不吝賜教。

您可能感興趣的文章:
  • PostgreSQL 創建表分區
  • 淺析postgresql 數據庫 TimescaleDB 修改分區時間范圍
  • 利用python為PostgreSQL的表自動添加分區
  • 如何為PostgreSQL的表自動添加分區
  • 淺談PostgreSQL 11 新特性之默認分區
  • PostgreSQL之分區表(partitioning)
  • PostgreSQL分區表(partitioning)應用實例詳解
  • PostgreSQL教程(三):表的繼承和分區表詳解
  • 淺談PostgreSQL表分區的三種方式

標簽:來賓 株洲 錦州 蚌埠 晉城 衡陽 珠海 烏海

巨人網絡通訊聲明:本文標題《PostgreSQL LIST、RANGE 表分區的實現方案》,本文關鍵詞  PostgreSQL,LIST,RANGE,表,分區,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《PostgreSQL LIST、RANGE 表分區的實現方案》相關的同類信息!
  • 本頁收集關于PostgreSQL LIST、RANGE 表分區的實現方案的相關信息資訊供網民參考!
  • 推薦文章
    久久精品大片| 黄色短视频网站| 99久久精品国产国产毛片| 国产美女在线观看| 99热精品一区| 99久久网站| 国产综合91天堂亚洲国产| 久草免费在线视频| 九九免费高清在线观看视频| 二级特黄绝大片免费视频大片| 韩国三级视频在线观看| 91麻豆精品国产高清在线| 日韩专区亚洲综合久久| 国产欧美精品| 超级乱淫黄漫画免费| 欧美爱色| 好男人天堂网 久久精品国产这里是免费 国产精品成人一区二区 男人天堂网2021 男人的天堂在线观看 丁香六月综合激情 | 午夜欧美福利| 日韩免费片| a级精品九九九大片免费看| 精品久久久久久中文| 午夜久久网| 日本特黄特色aa大片免费| 国产视频一区在线| 欧美a级片视频| 日韩欧美一二三区| 日韩中文字幕在线亚洲一区| 美女被草网站| 午夜欧美成人久久久久久| 精品视频一区二区三区| 99热热久久| 黄色免费网站在线| 久久国产一区二区| 国产不卡在线播放| 日本久久久久久久 97久久精品一区二区三区 狠狠色噜噜狠狠狠狠97 日日干综合 五月天婷婷在线观看高清 九色福利视频 | 免费国产在线视频| 欧美国产日韩久久久| 亚洲天堂在线播放| 日韩一级黄色| 欧美激情伊人| 香蕉视频久久| 日韩专区第一页| 国产一区二区精品尤物| 国产一区二区精品| 中文字幕一区二区三区精彩视频 | 成人免费一级纶理片| 国产伦久视频免费观看 视频 | 一本伊大人香蕉高清在线观看| 麻豆网站在线看| 中文字幕Aⅴ资源网| 天天做人人爱夜夜爽2020| 国产精品123| 麻豆网站在线免费观看| 欧美大片aaaa一级毛片| 成人高清免费| 国产综合成人观看在线| 欧美国产日韩一区二区三区| 国产a视频| 日韩中文字幕一区| 欧美爱色| 国产一级生活片| 一级女性全黄久久生活片| 韩国三级香港三级日本三级la| 日韩avdvd| 国产综合91天堂亚洲国产| 日韩中文字幕在线播放| 中文字幕一区二区三区精彩视频 | 亚洲女人国产香蕉久久精品 | 国产网站免费视频| 精品久久久久久影院免费| 亚欧成人乱码一区二区| 久久国产精品永久免费网站| 日韩中文字幕一区二区不卡| 日本在线www| 国产一区二区精品久| 国产高清视频免费| 精品视频免费看| 好男人天堂网 久久精品国产这里是免费 国产精品成人一区二区 男人天堂网2021 男人的天堂在线观看 丁香六月综合激情 | 国产成人精品在线| 日本久久久久久久 97久久精品一区二区三区 狠狠色噜噜狠狠狠狠97 日日干综合 五月天婷婷在线观看高清 九色福利视频 | 日本在线不卡视频| 精品久久久久久综合网| 日韩欧美一二三区| 午夜激情视频在线观看| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 日韩中文字幕在线亚洲一区| 日韩在线观看视频黄| 国产国产人免费视频成69堂| 国产一区二区精品| 精品视频一区二区三区| 美国一区二区三区| 日韩在线观看视频网站| 999久久66久6只有精品| 成人免费高清视频| 国产伦久视频免费观看 视频| 午夜欧美成人久久久久久| 国产成人精品影视| 二级特黄绝大片免费视频大片| 日日日夜夜操| 精品国产三级a| 美女免费黄网站| 国产一区国产二区国产三区| 毛片电影网| 黄色福利| 欧美国产日韩在线| 久久99中文字幕| 日日夜人人澡人人澡人人看免| 欧美另类videosbestsex视频| 一a一级片| 欧美1区| 欧美激情一区二区三区在线| 欧美激情在线精品video| 亚洲精品久久玖玖玖玖| 欧美a级片视频| 国产网站免费视频| 精品在线观看国产| 国产不卡在线看| 美女免费黄网站| 一级女人毛片人一女人| 精品国产一区二区三区久 | 亚洲精品影院| 99热精品一区| 欧美a级成人淫片免费看| 亚洲第一视频在线播放| 黄视频网站免费看| 尤物视频网站在线观看| 尤物视频网站在线观看| 日本久久久久久久 97久久精品一区二区三区 狠狠色噜噜狠狠狠狠97 日日干综合 五月天婷婷在线观看高清 九色福利视频 | 亚洲第一视频在线播放| 成人影院一区二区三区| 日日夜夜婷婷| 中文字幕一区二区三区精彩视频| 国产高清视频免费观看| 91麻豆国产级在线| 久久99这里只有精品国产| 精品在线免费播放| 国产麻豆精品| 欧美激情一区二区三区视频高清| 成人免费一级毛片在线播放视频| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 九九免费精品视频| 国产综合成人观看在线| 青青久热| 国产一区二区福利久久| 欧美国产日韩久久久| 国产成人啪精品| 精品视频免费在线| 国产一区二区精品| 亚洲第一视频在线播放| 久久精品大片| 91麻豆精品国产自产在线| 欧美日本韩国| 高清一级片| 日本特黄特色aa大片免费| 日韩一级精品视频在线观看| 免费国产在线观看不卡| 99色视频在线观看| 91麻豆精品国产高清在线| 成人高清视频在线观看| 韩国毛片免费大片| 国产极品精频在线观看| 黄色福利| 高清一级片| 青青久在线视频| 久久99中文字幕| 91麻豆爱豆果冻天美星空| 欧美激情一区二区三区视频 | 国产一区二区精品在线观看| 亚州视频一区二区| 国产麻豆精品视频| 欧美激情一区二区三区视频 | 欧美大片aaaa一级毛片| 国产91精品系列在线观看| 欧美大片一区| 亚欧视频在线| 久草免费在线视频| 日本在线www| 日韩中文字幕在线亚洲一区| 精品久久久久久中文| 欧美激情一区二区三区视频高清| 在线观看导航| 日韩专区第一页| 四虎影视久久久| 日韩在线观看免费完整版视频| 日本久久久久久久 97久久精品一区二区三区 狠狠色噜噜狠狠狠狠97 日日干综合 五月天婷婷在线观看高清 九色福利视频 | 日韩一级黄色片| 亚洲天堂免费观看| 成人高清护士在线播放| 亚洲 男人 天堂| 黄视频网站免费看| 欧美日本二区| 成人免费一级纶理片| 91麻豆精品国产自产在线| 成人高清免费| 麻豆系列国产剧在线观看| 97视频免费在线| 黄视频网站免费看| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 久草免费资源| 精品久久久久久中文|