<font id="nc9yk"></font>
  • <tt id="nc9yk"></tt>
          <rp id="nc9yk"><optgroup id="nc9yk"></optgroup></rp>
          <tt id="nc9yk"><form id="nc9yk"></form></tt>

            <cite id="nc9yk"></cite>

            淺談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

            最新評論

            hao500彩票 www.mh1819.com:嵩明县| www.ahmaj.com:长岛县| www.ovomasturbador.com:庆元县| www.mfkxn.com:百色市| www.heidiphotographers.com:庄浪县| www.xzjwgczw.com:留坝县| www.xqlcw.cn:团风县| www.harmsworth.org:齐齐哈尔市| www.lixiaoqiu.com:台州市| www.rrrsz.com:安乡县| www.changinglivesdayspa.com:嘉鱼县| www.daxingxiyiji.com:汾西县| www.cantaxhelp.com:洞口县| www.yongqinlaw.com:嵩明县| www.insect-museum.com:池州市| www.fzjiaolun.com:博白县| www.maison-den-haut.com:新沂市| www.myzhaosf.com:嘉荫县| www.sunmastering.com:竹溪县| www.casualtyofdesign.com:金堂县| www.innovatech-peru.com:子长县| www.foxbreaks.com:隆昌县| www.ykw100.com:津市市| www.howtowriteanad.com:茂名市| www.imageislife.com:海门市| www.bjblwed.com:彝良县| www.joannaselby.com:沅江市| www.uuxer.com:中西区| www.hg79456.com:即墨市| www.ahlikartu.com:虹口区| www.agaogluexport.com:南华县| www.valentine1china.com:海伦市| www.hzzgg.com:资源县| www.bagit2go.com:恭城| www.wartapasar.com:五常市| www.emedicalweb.com:鹤峰县| www.medicalspaofrye.com:红原县| www.wughsc.com:麻江县| www.hg0088ag.com:哈巴河县| www.lzmlh.com:青浦区| www.jdmdw.com:义乌市| www.akaeno.com:怀来县| www.vertaxtechnology.com:天气| www.desengulu.com:甘洛县| www.limonychelo.com:鹤峰县| www.jiphoton-inc.com:泗水县| www.debibaker.org:昌平区| www.thecreditscholar.com:永靖县| www.zumbafarnorthcoast.com:苍梧县| www.obatviagraasli.com:德惠市| www.webz-international.com:南宫市| www.ytsldc.com:宝山区| www.emploi-quebec-trousse.com:阿瓦提县| www.harmsworth.org:凤台县| www.bicaraperpustakaan.com:宣汉县| www.manganetabarespoiler.com:依兰县| www.arcadaproductions.com:神木县| www.kieanna.com:新宾| www.drugs-rx.com:原平市| www.wkdlc.com:台安县| www.cp3115.com:铁岭市| www.linkflys.com:青河县| www.beautyonstage.com:宜兰县| www.ycmyxs.com:勐海县| www.zshxyl.com:剑阁县| www.uggboots999.com:五指山市| www.pikaglass.com:保康县| www.allsmsfree.com:高碑店市| www.lclxh.com:托克逊县| www.kerala-honeymoon-packages.com:花莲县| www.klifang.com:宾阳县| www.zhuangshita88.com:平遥县| www.zhuanhuatong.com:五原县| www.autocar-dax.com:翁源县| www.jas-cn.com:山阳县| www.taoquanou.com:广灵县| www.payrollmaturity.com:大埔县| www.559367.com:垫江县| www.spotcoolstuff.net:巴楚县| www.szmm120.com:大关县| www.caefwi.org:大理市| www.baina-edu.com:广宁县| www.le-bon-debarras.com:梁平县| www.yupaixieye.com:三门峡市|