<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.nnljhp.com:井研县| www.africanshawlsupplier.com:明溪县| www.m6885.com:孟州市| www.biganimaimovies.com:汕尾市| www.shofarr.com:临颍县| www.tradingjm.com:神池县| www.expressmasti.com:龙海市| www.shgsfwls.com:云龙县| www.tagged-login.com:龙州县| www.69k96.com:偃师市| www.magazintelevizyonu.com:墨江| www.mzansi24.com:含山县| www.peacpainting.com:武穴市| www.xffrw.cn:师宗县| www.cosmosofsweden.com:金昌市| www.gumur.com:芒康县| www.wldzdp.com:互助| www.ourmanufacturers.com:九龙县| www.leicestercityjersey.com:凌海市| www.rememberforeverphotography.com:临沧市| www.kitagaya.com:定边县| www.webefendi.com:大悟县| www.netjetmarketing.com:台州市| www.r7678.com:宁陕县| www.6220k.com:汶上县| www.xzjwgczw.com:叶城县| www.foligroup.com:宣威市| www.iconachive.com:巴彦淖尔市| www.360allred.com:米脂县| www.amzabawki.com:大余县| www.taxisenbarcelona.com:横山县| www.huangshouqi.com:梅河口市| www.hg51456.com:航空| www.yjttw.cn:翼城县| www.alarmsunrise.com:东丰县| www.rjsprafka.com:启东市| www.maksoyun.com:根河市| www.betonaburi.com:松原市| www.brillonenbarrois.org:丰镇市| www.brilliantgarmentco.com:长乐市| www.ericemily.com:迁安市| www.qn556.com:布拖县| www.cerveaures.com:长乐市| www.cjbrw.cn:疏勒县| www.kxwzqw.com:平度市| www.office-mode.com:陵水| www.hongtaitiyu.com:平阴县| www.qywdj.com:宁强县| www.wwwswjlll.com:宿迁市| www.626190.com:永胜县| www.capsule-toys-hk.com:含山县| www.czjz123.com:广东省| www.conet-working.com:托里县| www.tcga4u.org:阳城县| www.natural-cuba.com:崇义县| www.blogbebas.com:南雄市| www.mfnck.com:眉山市| www.houyanjun.com:威远县| www.massage-to-heal.com:梓潼县| www.all-market.org:广东省| www.glassfart.com:莆田市| www.gcxlsj.com:上虞市| www.shgsfwls.com:孟州市| www.golddragonrecruiter.com:中江县| www.wunderkind56dvoek.net:平顶山市| www.modernimagelisam.com:闽清县| www.waerdi.com:扎囊县| www.q2969.com:象山县| www.foothill-bible.org:阳高县| www.miaomi20.com:田阳县| www.zzjiuda.com:花莲市| www.activeppcturkiye.com:宜城市| www.viralcoins.com:东方市| www.pj88853.com:江安县| www.mejoresamigas.net:东乌珠穆沁旗| www.louisgh.com:进贤县| www.gs355.com:柳江县| www.r3diamonds.com:沅陵县| www.liujianshufa.com:瑞丽市| www.total-cover.com:扶风县| www.hg345999.com:德格县| www.iforoz.com:荣成市| www.gq992.com:徐汇区| www.giteaux5lucarnes.com:扎赉特旗|