zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    Quote comes from C. Joybell C.
    Operating System: Three Easy Pieces --- LDE (Note)
    Operating System: Three Easy Pieces --- Pthread Locks (Note)
    Operating System: Three Easy Pieces --- Locks (Note)
    Modern Operating System --- Multiple Processor Systems
    Modern Operating System --- Power Management (CPU)
    Modern Operating System --- Power Management (Hard Disk)
    ls指定日期和时间输出格式
    python StringIO
    PING命令入门详解
  • 原文地址:https://www.cnblogs.com/xibuhaohao/p/11841583.html
Copyright © 2011-2022 走看看