partition优缺点:
优点:
(1)数据维护成本降低。比如:某一部分数据需要失效,可以直接接触绑定关系,接触绑定的数据和分区表都依然保留,需要时可以随时恢复。
(2)一个表只能放在一个物理空间上,使用分区表之后可以将不同的表放置在不同的物理空间上。
(3)直接从分区表查询数据比从一个大而全的全量数据表中读取数据效率更高。
缺点:
(1)通过分区表的父表查数据相对于普通的数据全量表查询效率要低。直接分区表中查询数据比在全量表中查询数据效率要高。
(2)主键有可能重复。由于分区表的的主键约束都是分别建立的,因此可能存在主键重复。
使用场景:
(1)如果历史数据查询机率较低,将历史数据放置在单独数据表中,增量数据放置在分区表中,程序直接查询分区表能够带来更好的查询效率。
pg_pathman与partition对比
pg_pathman
支持HASH和RANGE分区
支持自动和手动的分区维护
提供在线分区实施(在线重定义),父表数据迁移到子表,拆分, 合并分区
不足:
不支持二级分区
权限,索引,trigger等无法继承
修改主键默认的seq需要重建分区。
partition
支持hash,range,list分区
支持多字段组合分区,支持表达式分区
支持创建主键,外键,索引,分区表自动继承
支持update分区键
支持分区表DETACH,ATTACH,
支持二级分区
不足:
分区表不可以作为其他表的外键主表
pg_pathman安装部署 pg_pathman-1.5.11.zip
容器内执行如下代码:
apt-get update
apt-get -y install unzip
apt-get -y install gcc automake autoconf libtool make
apt-get install -y libpq-dev
find / -name pg_config
export PATH=/usr/bin:$PATH
apt-get install -y postgresql-server-dev-12
unzip pg_pathman-1.5.11.zip
cd pg_pathman-1.5.11
make USE_PGXS=1
make USE_PGXS=1 install
pg_pathman配置
/var/lib/postgresql/data/postgresql.conf
shared_preload_libraries = 'pg_pathman'
重启数据库
进入数据库,导入插件pg_pathman
create extension pg_pathman;
select extname, extowner from pg_extension;
到此 pg_pathman 安装完成。
pg_pathman分区表实施
表必需满足
- 字段 created_time not null
- 无外键约束
分表 false 表示禁止数据移动
create extension pg_pathman;
select create_range_partitions('be_user_record'::regclass,'record_time','2018-01-01 00:00:00'::timestamp,interval '1 month', null,false);
查看分区表
select * from pathman_partition_list
并行迁移数据
select partition_table_concurrently('be_user_record'::regclass,10000,1.0);
查看迁移状态
select * from pathman_concurrent_part_tasks ;
禁主表
select set_enable_parent('be_user_record'::regclass,false);
partition分区表实施
CREATE TABLE public.be_user_record2 (
)PARTITION BY RANGE(record_time);
CREATE TABLE be_user_record2_history PARTITION OF be_user_record2 FOR VALUES FROM (MINVALUE) TO ('2018-12-01');
CREATE TABLE be_user_record2_201812 PARTITION OF be_user_record2 FOR VALUES FROM ('2018-12-01') TO ('2019-01-01');
CREATE TABLE be_user_record2_201901 PARTITION OF be_user_record2 FOR VALUES FROM ('2019-01-01') TO ('2019-02-01');
校验
partition 分区前后,主表的索引增删直接分区表,分区表可以独立增删索引。
SELECT * FROM pg_partition_tree('be_user_record2');
select * from pg_indexes where tablename='be_user_record2_201912';