一、分区
概念(提高性能)
1、表分区
2、分区示意图
注:三个分区,九个子分区
3、数据分布&分区
4、全表扫描VS分区扫描
注:全表扫描:会对全部segment全部数据扫描;
分区扫描:会找到segment下的子分区,通过子分区就可以找到数据;
5、决定表的分区策略
6、创建分区表(优化)
注:对基表和堆表是不能创建分区的;
代码:
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)定义日期范围分区表
(2)定义数字范围分区表
注:EVERY(1)表示以1为增量,一个一个的增加;
(3)创建列表分区表
注:LIST指明是列表分区
(4)定义多级分区表
注:subpartition template为子分区模板,之后只需要添加主分区就可以自动创建子分区了
(5)分区表的限制
主键或者唯一约束必须包含表中的所有分区键;
7、装载分区表
8、验证分区策略
注:分区策略如果是合适的,我们在对分区键进行查询的时候会匹配到相关的分区;
9、分区选择性扫描策略
10、查看分区设计
(1)通过pg_partitions视图查看分区表设计情况
(2)如下视图也可以查看分区表的信息:
11、维护分区表
必须使用ALTER TABLE 命令从顶级表来维护分区;
(1)添加分区
使用ALTER TABLE 命令在存在的分区表上添加新分区。
subpartition template设计:
注:ALTER TABLE tb_cp_05 DROP DEFAULT PARTITION;(因为已经存在默认分区了,所以需要删除默认分区,重新创建新的)
2)原分区不包含:
注:如果存在默认分区,只能从默认分区中拆分新的分区,如果有默认分区了ADD会失败;
12、维护分区表
(1)重命名分区·
1)修改父表名称,将会影响所有分区表
2)只修改分区名称
注:FOR关键字会帮助我们找到对应的分区;
(2)删除分区
使用ALTER TABLE 命令删除分区表中的分区。
1)删除默认分区
2)对于多级分区表,为同一层每一个分区删除默认分区
注:RANK(1)表示第一层分区;RANK(2)表示第二层分区;
(3)添加缺省分区
1)使用ALTER TABLE 命令添加默认分区:
ALTER TABLE tbcp05 ADD DEFAULT PARTITION other;
2)如果是多级分区表,同一层每个分区都需要默认分区:
13、清空分区数据
(1)清空分区数据
使用ALER TABLE 命令来清空分区:
ALTER TABLE tpcp05 TRUNCATE PARTITION FOR (RANK(1)) ;