• PostgreSQL 分区索引演进


    PostgreSQL 分区表,操作性相当便捷。

    但只能在创建时决定是否为分区表,并决定分区条件字段,普通表创建后,不能在修改为分区表。

    Note:通过其他方法也可转化为分区表。

    和其他数据库一样,分区表作为一个DB的特性,优点自不用说,物理分散,逻辑统一。

    必须要注意的一个缺点是:分区表不允许其他表作为外键引用。只能在真实场景业务逻辑上当作外键,设计时论场景再推敲。

    一、分区索引

    在Pg 11以前只能单独为每个分区表建立索引等,且不能在【母表】上建立主键、索引等。

    Pg 11以后可以针对“逻辑”分区表(母表)建立索引,分区子表自动创建。

    简单Sql:

    复制代码
     1 --DROP TABLE dbo.table01;
     2 
     3 CREATE TABLE dbo.table01 (
     4   id        bigserial NOT NULL,
     5   cre_time  timestamp without time zone,
     6   note      varchar(30)
     7 ) PARTITION BY RANGE (cre_time)
     8   WITH (
     9     OIDS = FALSE
    10   );
    11 
    12 CREATE TABLE dbo.table01_2018
    13   PARTITION OF dbo.table01
    14   FOR VALUES FROM ('2018-01-01 00:00:00') TO ('2019-01-01 00:00:00');
    15 
    16 CREATE TABLE dbo.table01_2017
    17   PARTITION OF dbo.table01
    18   FOR VALUES FROM ('2017-01-01 00:00:00') TO ('2018-01-01 00:00:00');
    19 
    20 ALTER TABLE dbo.table01
    21   OWNER TO postgres;

    二、分区表唯一约束

    对于 PostgreSQL 10,只能基于分区创建唯一约束(PRIMARY KEY 和 UNIQUE KEY),而不能针对分区的父表创建唯一约束。PostgreSQL 11 支持分区表上的唯一约束。
    CREATE TABLE rtable(c1 INT, c2 VARCHAR(10)) PARTITION BY RANGE(c1);
    ALTER TABLE rtable ADD CONSTRAINT pk_rtable PRIMARY KEY(c1);
    d rtable
                          Table "public.rtable"
     Column |         Type          | Collation | Nullable | Default
    --------+-----------------------+-----------+----------+---------
     c1     | integer               |           | not null |
     c2     | character varying(10) |           |          |
    Partition key: RANGE (c1)
    Indexes:
        "pk_rtable" PRIMARY KEY, btree (c1)
    Number of partitions: 0
    123456789101112
    添加分区或者加载(ATTACH)分区时自动创建相应的主键:
    CREATE TABLE rtable100 PARTITION OF rtable FOR VALUES FROM (1) TO (100);
    d rtable100
                        Table "public.rtable100"
     Column |         Type          | Collation | Nullable | Default
    --------+-----------------------+-----------+----------+---------
     c1     | integer               |           | not null |
     c2     | character varying(10) |           |          |
    Partition of: rtable FOR VALUES FROM (1) TO (100)
    Indexes:
        "rtable100_pkey" PRIMARY KEY, btree (c1)
    12345678910
    如果在分区表上创建了唯一约束,无法再创建基于外部表(FOREIGN TABLE)的分区。因为无法为外部表创建唯一约束。
    CREATE FOREIGN TABLE rtable200 PARTITION OF rtable FOR VALUES FROM (101) TO (200) SERVER remote1;
    ERROR:  cannot create index on foreign table "rtable200"
    12
    主键约束或唯一约束必须包含分区字段。这样才能确保整个分区表内的唯一性,因为每个分区上的唯一约束只维护自身的唯一性。
    CREATE TABLE rtable1(c1 INT, c2 VARCHAR(10)) PARTITION BY RANGE(c1);
    ALTER TABLE rtable1 ADD CONSTRAINT pk_table1 PRIMARY KEY(c2);
    ERROR:  insufficient columns in PRIMARY KEY constraint definition
    DETAIL:  PRIMARY KEY constraint on table "rtable1" lacks column "c1" which is part of the partition key.
    1234
    新的索引修改语句 ALTER INDEX ATTACH PARTITION 可以将分区上的已有索引挂载到分区表上的索引。

    转载自:

    https://www.cnblogs.com/jonney-wang/p/9238923.html

    https://blog.csdn.net/horses/article/details/85986558

  • 相关阅读:
    CSU 1333 Funny Car Racing
    FZU 2195 检查站点
    FZU 2193 So Hard
    ZOJ 1655 FZU 1125 Transport Goods
    zoj 2750 Idiomatic Phrases Game
    hdu 1874 畅通工程续
    hdu 2489 Minimal Ratio Tree
    hdu 3398 String
    洛谷 P2158 [SDOI2008]仪仗队 解题报告
    POJ 1958 Strange Towers of Hanoi 解题报告
  • 原文地址:https://www.cnblogs.com/xibuhaohao/p/11841583.html
Copyright © 2020-2023  润新知