基于Postgresql 10.2 版本, 实现简单的Hash分区
Postgresql 10 之前的版本,不支持 内建的直接分区,但是可以以继承表加触发器或者规则的方式实现简单分区的功能.随着Postgresql 10 版本的发行,源代码中实现了range和list 分区功能.在参考别人实现方法的同时,试着在新版本实现Hash分区.(持续更新中)
思路
- 先创建主表,再创建分区表,语法同list,range 类似.
- 插入数据时根据分区键(key)查找被插入的子分区.
- 暂时仅支持静态添加分区.
- select时约束排除时使用相同的算法过滤分区.
建表语法
创建Hash分区语法: 和list和range 类似,只是在建立子分区时,没有约束值.
me=# create table hash_table(id int,name text) partition by hash(id);
CREATE TABLE
时间:7.496 ms
me=# create table hash_table1 partition of hash_table;
CREATE TABLE
时间:8.173 ms
me=# create table hash_table2 partition of hash_table;
CREATE TABLE
时间:7.058 ms
me=# \d+ h*;
数据表 "public.hash_table"
栏位 | 类型 | Collation | Nullable | Default | 存储 | 统计目标 | 描述
------+---------+-----------+----------+---------+----------+----------+------
id | integer | | | | plain | |
name | text | | | | extended | |
Partition key: HASH (id)
Partitions: hash_table1 FOR HASH PARTITION Hashvalue = 1,
hash_table2 FOR HASH PARTITION Hashvalue = 2
数据表 "public.hash_table1"
栏位 | 类型 | Collation | Nullable | Default | 存储 | 统计目标 | 描述
------+---------+-----------+----------+---------+----------+----------+------
id | integer | | | | plain