PostgreSQL 分区表一点也不差_分区表

MYSQL 在分区表上的缺失不同,POSTGRESQL 的分区表那算是“硬可”。PG11 已经推出了HASH 分区。具体操作是怎样


首先分区表的大致用途有那些

1  在符合业务的基础上,能对合理的预设的查询提高查询的速度

2  在符合业务的基础上,能对数据的插入降低热点块的竞争,提高插入速度

3  在某些场合合理的访问分区可能顺序的扫描分区内的数据比使用分区内的索引更能提高数据访问的性能。

4  合理的设置分区,会更方便处理无用的数据,统一将一个分区内的数据进行处理。


目前 POSTGRESQL 支持的分区方式有

1   Range Partitiioning

2   List Partitioning

3   Hash Partitioning


与ORACLE 差不多的是,每个分区也是可以有自己的子分区的索引,默认值,或者一些其他定义。


另外一件事情是分区这个事情是需要有预先的设计的,而不是在系统的数据库表已经运行了好长一段时间后,在去做分区表。所以在系统设计之初就做好设计工作是重要的。


下面我们就来做点什么


1 HASH Partitioning  这是在 PG 11 中的新功能 ,通过HASH partitioning 可以加速数据的插入,这也是ORACLE DBA 引以为豪的傲娇点。


下面建立一个HASH分区表,这里已BIGINT 为主键,插入的主键除以10后余数来选择记录的落点。


后面直接插入20万数据不到1 秒就完成了


PostgreSQL 分区表一点也不差_分区表_02


我们来看看插入的数据,基本上都打散了。


PostgreSQL 分区表一点也不差_数据_03

查询也是没有问题,走了主键的索引

PostgreSQL 分区表一点也不差_主键_04


而清除一个分区表的数据也很简单,直接删除那个表就可以了

PostgreSQL 分区表一点也不差_主键_05

如果想继续恢复那个分区也是很容易的事情


当然如果你想保留数据分区表的部分数据,但又不想他成为分区表中的一员也很简单。

PostgreSQL 分区表一点也不差_主键_06


同时PostgreSQL 也同样支持range 分区的类型,通过range 类型的分区可以根据已经设计好的日期,或者其他表中的行数据进行划分,进行分区表存储。

废话不说,建立相关的表和分区表



PostgreSQL 分区表一点也不差_数据_07

在建立日期类型的分区表中,要注意到to 是不包含后面指定的时间段,如果设置成 from ('2008-01-01') to ('2008-12-31')  下一个range 设置成 from ('2019-01-01') to ('2019-12-31') 则在插入数据的时候会报

no partition of relation found for row

的问题。

另一个问题是,建立分区表的时候(Postgresql 不建议建立主键,这样会引起以后必要的麻烦,如果需要可以建立唯一索引)

创建一个存储过程来进行数据的插入,看看分区表是否有问题

create or replace procedure insert_data()

language plpgsql

as $$

declare 

date_value timestamp;

declare id int;

begin

date_value := '2007-01-01 00:00:00'::timestamp + '1 hour';

id = 1;

while id < 400000 loop

insert into range_test (password,insert_date) (select id::char(48),date_value::timestamp);

id = id + 1;

date_value  := date_value::timestamp + '1 hour';

end loop;

end;

$$;



PostgreSQL 分区表一点也不差_数据_08


通过图中的两条语句来进行数据的验证,没有问题。



根据查询的要求我们还可以建立相关的分区索引


PostgreSQL 分区表一点也不差_分区表_09


当然如果全表查询,也可以走全局的索引

PostgreSQL 分区表一点也不差_分区表_10