一、分区

概念(提高性能)

greenplum 导入yml分割符 greenplum分区_分区表

 

1、表分区

greenplum 导入yml分割符 greenplum分区_greenplum 导入yml分割符_02

 

2、分区示意图

greenplum 导入yml分割符 greenplum分区_多级_03

 

 注:三个分区,九个子分区

 

3、数据分布&分区

greenplum 导入yml分割符 greenplum分区_数据_04

 

4、全表扫描VS分区扫描

greenplum 导入yml分割符 greenplum分区_数据_05

 注:全表扫描:会对全部segment全部数据扫描;

        分区扫描:会找到segment下的子分区,通过子分区就可以找到数据;

 

5、决定表的分区策略

greenplum 导入yml分割符 greenplum分区_多级_06

 

6、创建分区表(优化)

greenplum 导入yml分割符 greenplum分区_数据_07

注:对基表和堆表是不能创建分区的;

代码:

create table tb_cp_01(id int , date date, amt decimal(10,2)) distributed by (id)

partition by range(date)  --指定分区为date字段

(

start (date '2022-01-01') inclusive  --inclusive是包含的意思

end  (date '2023-01-01') exclusive --exclusive是不包含意思,默认也是start包含,end不包含

every (interval '1 day')  --一天产生一个分区,会产生356个分区

);

\d tb_cp_01

\d tb_cp_01_prt_10  --查看分区子表

 

(1)定义日期范围分区表

 

greenplum 导入yml分割符 greenplum分区_多级_08

 

 (2)定义数字范围分区表

greenplum 导入yml分割符 greenplum分区_greenplum 导入yml分割符_09

 

注:EVERY(1)表示以1为增量,一个一个的增加; 

 

(3)创建列表分区表

greenplum 导入yml分割符 greenplum分区_greenplum 导入yml分割符_10

 

 注:LIST指明是列表分区

 

(4)定义多级分区表

greenplum 导入yml分割符 greenplum分区_分区表_11

 注:subpartition template为子分区模板,之后只需要添加主分区就可以自动创建子分区了

 

 

greenplum 导入yml分割符 greenplum分区_多级_12

 

(5)分区表的限制

  主键或者唯一约束必须包含表中的所有分区键;

 

7、装载分区表

greenplum 导入yml分割符 greenplum分区_分区表_13

 

 

8、验证分区策略

greenplum 导入yml分割符 greenplum分区_greenplum 导入yml分割符_14

 

 注:分区策略如果是合适的,我们在对分区键进行查询的时候会匹配到相关的分区;

 

9、分区选择性扫描策略

greenplum 导入yml分割符 greenplum分区_分区表_15

 

 

10、查看分区设计

(1)通过pg_partitions视图查看分区表设计情况

greenplum 导入yml分割符 greenplum分区_分区表_16

 

 

 (2)如下视图也可以查看分区表的信息:

greenplum 导入yml分割符 greenplum分区_greenplum 导入yml分割符_17

 

11、维护分区表

必须使用ALTER TABLE 命令从顶级表来维护分区;

(1)添加分区

  使用ALTER TABLE 命令在存在的分区表上添加新分区。

subpartition template设计:

greenplum 导入yml分割符 greenplum分区_分区表_18

 

注:ALTER TABLE tb_cp_05 DROP DEFAULT PARTITION;(因为已经存在默认分区了,所以需要删除默认分区,重新创建新的)

   2)原分区不包含:

greenplum 导入yml分割符 greenplum分区_数据_19

 

 注:如果存在默认分区,只能从默认分区中拆分新的分区,如果有默认分区了ADD会失败;

 

12、维护分区表

(1)重命名分区·

greenplum 导入yml分割符 greenplum分区_greenplum 导入yml分割符_20

 

   1)修改父表名称,将会影响所有分区表

greenplum 导入yml分割符 greenplum分区_多级_21

 

 

greenplum 导入yml分割符 greenplum分区_数据_22

 

   2)只修改分区名称

greenplum 导入yml分割符 greenplum分区_多级_23

 

 注:FOR关键字会帮助我们找到对应的分区;

 

(2)删除分区

  使用ALTER TABLE 命令删除分区表中的分区。

  1)删除默认分区

greenplum 导入yml分割符 greenplum分区_多级_24

 

   2)对于多级分区表,为同一层每一个分区删除默认分区

greenplum 导入yml分割符 greenplum分区_多级_25

注:RANK(1)表示第一层分区;RANK(2)表示第二层分区;

 

(3)添加缺省分区

  1)使用ALTER TABLE 命令添加默认分区:

  ALTER TABLE tbcp05 ADD DEFAULT PARTITION other;

  2)如果是多级分区表,同一层每个分区都需要默认分区:

  

greenplum 导入yml分割符 greenplum分区_多级_26

 

13、清空分区数据

(1)清空分区数据

  使用ALER TABLE 命令来清空分区:

    ALTER TABLE tpcp05 TRUNCATE PARTITION FOR (RANK(1)) ;