<rp id="kut09"><nav id="kut09"></nav></rp>
<rp id="kut09"></rp>
  • <tt id="kut09"></tt>
    <tt id="kut09"><tbody id="kut09"></tbody></tt>
    1. <u id="kut09"></u>
    2. <tt id="kut09"><noscript id="kut09"></noscript></tt>
    3. 淺談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

      最新評論

      218彩票 www.kyriakosandkolette.com:海兴县| www.leominstersba.com:正宁县| www.ctr-fk2register.com:昌江| www.cheapcialisnow.net:东明县| www.stevebayer.com:德保县| www.dawntoner.com:驻马店市| www.19-2.com:体育| www.martabevacqua.com:丹江口市| www.dennisforhire.com:北海市| www.gs355.com:饶河县| www.flickneroptometry.com:清原| www.ghyakeli.com:京山县| www.keytitleva.net:柳林县| www.lakehousemitchell.com:福贡县| www.jeanlucarmand.com:寿宁县| www.youngwon1004.com:榆社县| www.careerinmining.com:阿图什市| www.pboworks.com:南城县| www.chengchitong.com:珠海市| www.s6lt.com:贵阳市| www.imageislife.com:兴文县| www.imagefilm-prod.com:杂多县| www.ifixart.com:抚远县| www.rphstc.com:陈巴尔虎旗| www.xunxi360.com:忻州市| www.tryinghardminimalist.com:永嘉县| www.ttjm6898lsc.com:娄底市| www.relationshipbreakp.com:连平县| www.hg52456.com:双辽市| www.sweetandnastyburlesque.com:如东县| www.ctspecialistsllc.com:肇州县| www.pzbxyx.com:天峨县| www.gs355.com:基隆市| www.ptlins.com:龙南县| www.wazww.com:黑水县| www.idleclickinggames.com:安庆市| www.dvmus.com:德庆县| www.moanabbqonline.com:宣化县| www.xzjwgczw.com:石城县| www.duchang999.com:信丰县| www.tagged-login.com:防城港市| www.godsyw.com:津市市| www.cropbowtie.com:丘北县| www.elegooo.com:盐亭县| www.carahedgepeth.com:成都市| www.aceophthalmics.com:潮安县| www.cbplanningpartners.com:砚山县| www.spjjs.com:颍上县| www.aodowear.com:甘南县| www.newcanaantutor.com:新源县| www.forum-hosting.com:呈贡县| www.ttjm6898lsc.com:乐清市| www.wonderfuldealspot.com:定州市| www.mjdxxss.com:绵竹市| www.chasyostsculpture.com:新安县| www.r7678.com:西充县| www.jxyataicy.com:高雄县| www.stokistgreenworld.com:河南省| www.ok1069.com:济源市| www.217765.com:噶尔县| www.wartapasar.com:鄂尔多斯市| www.mixbrand.net:海城市| www.grupochevrolet.com:盱眙县| www.hg70345.com:晋州市| www.jnsqzn.com:教育| www.5niu5.com:和政县| www.skillupnavi.com:宜宾县| www.daqingwater.com:通城县| www.hzxpp.com:廊坊市| www.jiamei369.com:葵青区| www.zhongyancheng.com:循化| www.ycjzsy.com:汉寿县| www.testingtutorials.net:临朐县| www.instantasshole.com:新巴尔虎右旗| www.xinya-painting.com:宝坻区| www.mermecinc.com:周至县| www.baike-zhidao-baidu.com:吉隆县| www.m8667.com:新疆| www.mydzs.com:陆河县| www.hongshunpuyi.com:山丹县| www.52adi.com:高雄市| www.jobexperts.org:志丹县| www.firmarehberisitesi.com:吉林市| www.benhvienungthu.com:岢岚县|