<tt id="eol1w"></tt>
  • 淺談PostgreSQL 11 新特性之默認分區

     更新時間:2020年12月29日 15:16:36   作者:不剪發的Tony老師  
    這篇文章主要介紹了淺談PostgreSQL 11 新特性之默認分區,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧

    文章目錄

    PosgtreSQL 11 支持為分區表創建一個默認(DEFAULT)的分區,用于存儲無法匹配其他任何分區的數據。顯然,只有 RANGE 分區表和 LIST 分區表需要默認分區。

    CREATE TABLE measurement (
      city_id     int not null,
      logdate     date not null,
      peaktemp    int,
      unitsales    int
    ) PARTITION BY RANGE (logdate);
    CREATE TABLE measurement_y2018 PARTITION OF measurement
      FOR VALUES FROM ('2018-01-01') TO ('2019-01-01');
    

    以上示例只創建了 2018 年的分區,如果插入 2017 年的數據,系統將會無法找到相應的分區:

    INSERT INTO measurement(city_id,logdate,peaktemp,unitsales)
    VALUES (1, '2017-10-01', 50, 200);
    ERROR: no partition of relation "measurement" found for row
    DETAIL: Partition key of the failing row contains (logdate) = (2017-10-01).

    使用默認分區可以解決這類問題。創建默認分區時使用 DEFAULT 子句替代 FOR VALUES 子句。

    CREATE TABLE measurement_default PARTITION OF measurement DEFAULT;
    \d+ measurement
                     Table "public.measurement"
     Column  | Type  | Collation | Nullable | Default | Storage | Stats target | Description 
    -----------+---------+-----------+----------+---------+---------+--------------+-------------
     city_id  | integer |      | not null |     | plain  |       | 
     logdate  | date  |      | not null |     | plain  |       | 
     peaktemp | integer |      |     |     | plain  |       | 
     unitsales | integer |      |     |     | plain  |       | 
    Partition key: RANGE (logdate)
    Partitions: measurement_y2018 FOR VALUES FROM ('2018-01-01') TO ('2019-01-01'),
          measurement_default DEFAULT

    有了默認分區之后,未定義分區的數據將會插入到默認分區中:

    INSERT INTO measurement(city_id,logdate,peaktemp,unitsales)
    VALUES (1, '2017-10-01', 50, 200);
    INSERT 0 1
    select * from measurement_default;
     city_id | logdate  | peaktemp | unitsales 
    ---------+------------+----------+-----------
        1 | 2017-10-01 |    50 |    200
    (1 row)
    

    默認分區存在以下限制:

    一個分區表只能擁有一個 DEFAULT 分區;

    對于已經存儲在 DEFAULT 分區中的數據,不能再創建相應的分區;參見下文示例;

    如果將已有的表掛載為 DEFAULT 分區,將會檢查該表中的所有數據;如果在已有的分區中存在相同的數據,將會產生一個錯誤;

    哈希分區表不支持 DEFAULT 分區,實際上也不需要支持。

    使用默認分區也可能導致一些不可預見的問題。例如,往 measurement 表中插入一條 2019 年的數據,由于沒有創建相應的分區,該記錄同樣會分配到默認分區:

    INSERT INTO measurement(city_id,logdate,peaktemp,unitsales)
    VALUES (1, '2019-03-25', 66, 100);
    INSERT 0 1
    select * from measurement_default;
     city_id | logdate  | peaktemp | unitsales 
    ---------+------------+----------+-----------
        1 | 2017-10-01 |    50 |    200
        1 | 2019-03-25 |    66 |    100
    (2 rows)
    

    此時,如果再創建 2019 年的分區,操作將會失敗。因為添加新的分區需要修改默認分區的范圍(不再包含 2019 年的數據),但是默認分區中已經存在 2019 年的數據。

    CREATE TABLE measurement_y2019 PARTITION OF measurement
      FOR VALUES FROM ('2019-01-01') TO ('2020-01-01');
    ERROR: updated partition constraint for default partition "measurement_default" would be violated by some row

    為了解決這個問題,可以先將默認分區從分區表中卸載(DETACH PARTITION),創建新的分區,將默認分區中的相應的數據移動到新的分區,最后重新掛載默認分區。

    ALTER TABLE measurement DETACH PARTITION measurement_default;
    CREATE TABLE measurement_y2019 PARTITION OF measurement
      FOR VALUES FROM ('2019-01-01') TO ('2020-01-01');
    INSERT INTO measurement_y2019
    SELECT * FROM measurement_default WHERE logdate >= '2019-01-01' AND logdate < '2020-01-01';
    INSERT 0 1
    DELETE FROM measurement_default WHERE logdate >= '2019-01-01' AND logdate < '2020-01-01';
    DELETE 1
    ALTER TABLE measurement ATTACH PARTITION measurement_default DEFAULT;
    CREATE TABLE measurement_y2020 PARTITION OF measurement
      FOR VALUES FROM ('2020-01-01') TO ('2021-01-01');
    \d+ measurement
                     Table "public.measurement"
     Column  | Type  | Collation | Nullable | Default | Storage | Stats target | Description 
    -----------+---------+-----------+----------+---------+---------+--------------+-------------
     city_id  | integer |      | not null |     | plain  |       | 
     logdate  | date  |      | not null |     | plain  |       | 
     peaktemp | integer |      |     |     | plain  |       | 
     unitsales | integer |      |     |     | plain  |       | 
    Partition key: RANGE (logdate)
    Partitions: measurement_y2018 FOR VALUES FROM ('2018-01-01') TO ('2019-01-01'),
          measurement_y2019 FOR VALUES FROM ('2019-01-01') TO ('2020-01-01'),
          measurement_y2020 FOR VALUES FROM ('2020-01-01') TO ('2021-01-01'),
          measurement_default DEFAULT
    

    官方文檔:Table Partitioning

    補充:postgresql10以上的自動分區分表功能

    一.列分表

    1.首先創建主分區表:

    create table fenbiao( 
    id int, 
    year varchar 
    ) partition by list(year)

    這里設置的是根據year列進行數據分表;創建后使用navicat是看不到的;

    2.創建分表:

    create table fenbiao_2017 partition of fenbiao for values in ('2017')

    create table fenbiao_2018 partition of fenbiao for values in ('2018')

    這樣這兩天數據會依靠規則插入到不同分表中,如果插入一條不符合規則的數據,則會報錯誤:no partition of relation "fenbiao" found for row.

    二.范圍分表

    1.以year列為范圍進行分表

    create table fenbiao2( 
    id int, 
    year varchar 
    ) partition by range(year)

    2.創建分表

    create table fenbiao2_2018_2020 partition of fenbiao2 for values from ('2018') to ('2020')

    create table fenbiao2_2020_2030 partition of fenbiao2 for values from ('2020') to ('2030')

    注意:此時插入year=2020會插入到下面的表;如下面表范圍為2021到2030,則會報錯;同時插入2030也會報錯;范圍相當于時a<=year<b;

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

    相關文章

    • Windows PostgreSQL 安裝圖文教程

      Windows PostgreSQL 安裝圖文教程

      PostgreSQL是一套功能強大的對象-關系型數據庫管理系統。經過十幾年的發展, PostgreSQL 是世界上可以獲得的最先進的開放源碼的數據庫系統
      2009-08-08
    • 解決postgresql 數字轉換成字符串前面會多出一個空格的問題

      解決postgresql 數字轉換成字符串前面會多出一個空格的問題

      這篇文章主要介紹了解決postgresql 數字轉換成字符串前面會多出一個空格的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
      2020-12-12
    • PostgreSQL管理工具phpPgAdmin入門指南

      PostgreSQL管理工具phpPgAdmin入門指南

      phpPgAdmin是用PHP開發的一個基于web的PostgreSQL數據庫管理工具。和MySql時代的PHPMyAdmin類似。本文介紹了phpPgAdmin安裝和使用方法,需要的朋友可以參考下
      2014-03-03
    • Postgresql ALTER語句常用操作小結

      Postgresql ALTER語句常用操作小結

      這篇文章主要介紹了Postgresql ALTER語句常用操作小結,本文講解了增加一列、刪除一列、更改列的數據類型、表的重命名、更改列的名字、字段的not null設置等常用操作的代碼示例,需要的朋友可以參考下
      2015-06-06
    • Postgresql備份和增量恢復方案

      Postgresql備份和增量恢復方案

      這篇文章主要給大家介紹了關于Postgresql備份和增量恢復的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用Postgresql具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
      2018-10-10
    • 詳解PostgreSQL 語法中關鍵字的添加

      詳解PostgreSQL 語法中關鍵字的添加

      這篇文章主要介紹了詳解PostgreSQL 語法中關鍵字的添加的相關資料,這里說明下在parser語法解析模塊添加關鍵字,需要的朋友可以參考下
      2017-08-08
    • Postgresql查詢效率計算初探

      Postgresql查詢效率計算初探

      這篇文章主要給大家介紹了關于Postgresql查詢效率計算的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用Postgresql具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
      2019-05-05
    • postgresql分頁數據重復問題的深入理解

      postgresql分頁數據重復問題的深入理解

      這篇文章主要給大家介紹了關于postgresql分頁數據重復問題的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用postgresql具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
      2019-04-04
    • PostgreSQL教程(十二):角色和權限管理介紹

      PostgreSQL教程(十二):角色和權限管理介紹

      這篇文章主要介紹了PostgreSQL教程(十二):角色和權限管理介紹,本文講解了數據庫角色、角色屬性、權限、角色成員,需要的朋友可以參考下
      2015-05-05
    • PostgreSQL 中字段類型varchar的用法

      PostgreSQL 中字段類型varchar的用法

      這篇文章主要介紹了PostgreSQL 中字段類型varchar的用法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
      2020-12-12

    最新評論

    盈利国际彩票 www.jasa228.com:淮安市| www.rdknw.cn:弋阳县| www.paintsprayerelite.com:岳西县| www.quit-list.com:江津市| www.666er456546.com:广元市| www.playmarket-androids.net:互助| www.doxycyclin.net:乐清市| www.doulasconciencia.com:禹城市| www.topgunshops.com:芜湖县| www.boboschinesedeli.com:阿克陶县| www.jh0oxs.com:南城县| www.taki100.net:咸阳市| www.wm-176.com:竹北市| www.bashmaistora-bg.com:高淳县| www.cn-ourui.com:南丰县| www.ibizacerrajero.com:防城港市| www.petshopkapinda.com:贡觉县| www.eldukedegreaser.com:正蓝旗| www.headsion.cn:丰台区| www.kitagaya.com:达孜县| www.beautysalonsolutions.com:高尔夫| www.toreadmoto.com:青河县| www.jommar.com:南漳县| www.safecarservice.com:泰兴市| www.elegooo.com:报价| www.apexautoleasing.com:山丹县| www.edwardszmucmd.com:淮北市| www.leg7.com:新化县| www.xtrunchang.com:会宁县| www.jyodhisham.com:都江堰市| www.lavicardesigne.com:仙游县| www.sw557.com:封开县| www.andrewcambron.com:洪泽县| www.employerlawblog.com:丹寨县| www.365zhy.com:玛纳斯县| www.szqtouch.com:赤城县| www.joedonovanpersonaltraining.com:岳普湖县| www.bmnjn.com:永和县| www.bjyxyrw.com:大城县| www.adapir.com:赞皇县| www.mofo-nyc.com:西和县| www.e-andac.com:东源县| www.buchuebersetzungen.com:眉山市| www.hg20345.com:沙湾县| www.qyu3.com:马山县| www.1pshouhui.com:四会市| www.jingyi111.com:望奎县| www.chinacheapshop.com:桦川县| www.flex-laser.net:河东区| www.mfnnf.com:咸丰县| www.275689.com:彰化县| www.thatspread.com:高安市| www.ryccc.com:息烽县| www.k7679.com:阿城市| www.flzco.com:怀宁县| www.scacsl.net:福鼎市| www.cn-reiz.com:太湖县| www.ahlikartu.com:长岛县| www.xwjsw.cn:郧西县| www.yzhytkd.com:铜梁县| www.xuenaruipet.com:丽江市| www.dywanliqizhong.com:筠连县| www.employerlawblog.com:堆龙德庆县| www.catchyenough.com:黔西县| www.nghethuatbongbay.com:和平县| www.nnljhp.com:卢氏县| www.cp6220.com:本溪市| www.shishibo4646.com:永定县| www.r7767.com:台湾省| www.bisutekirevere.com:南川市| www.solarisband.com:安达市| www.navette-9.com:云南省| www.aec-avocats.com:呼图壁县| www.agenciaaccords.com:芜湖市| www.dadupan.com:湖北省| www.psicologiaconsciente.com:盘山县| www.onewaytoliveband.com:邵东县| www.ramadawg.com:清远市| www.pobohn.com:岐山县| www.satext.com:南漳县| www.jjrc8.com:谢通门县| www.99jsdc.com:台北市| www.jinshayule53.com:武定县| www.qatarsworldcup.com:江永县|