PostgreSQL分区表(partitioning)应用实例(2)

如上所示,运行完成后即可创建4张分区子表,在上面的语句中我们添加了一个约束表示只允许插入本月的数据,接下来在这4张分区表的每个分区键上建立索引:

create index t_sys_log_y2016m09_operation_time ON t_sys_log_y2016m09(operation_time); create index t_sys_log_y2016m10_operation_time ON t_sys_log_y2016m10(operation_time); create index t_sys_log_y2016m11_operation_time ON t_sys_log_y2016m11(operation_time); create index t_sys_log_y2016m12_operation_time ON t_sys_log_y2016m12(operation_time);

到此为止我们的分区表就创建完毕了,接下来需要考虑数据插入的问题,如何才能让不同日期的数据自动的插入与其对应的分区子表中呢?有两种解决方案,分别是:规则(Rule)和触发器(Trigger),相比触发器,Rule的开销更大,所以我在这里就不做过多介绍了,下面直接介绍Trigger的方式。

Trigger通常会结合自定义函数(Function)来实现分区插入,Function负责根据条件选择插入,而Trigger则负责Function的自动调用。首先定义Function,功能很简单,即根据日期区间insert数据即可:

CREATE OR REPLACE FUNCTION sys_log_insert_trigger () RETURNS TRIGGER AS $$ BEGIN IF ( NEW .operation_time >= DATE '2016-09-01' AND NEW .operation_time < DATE '2016-10-01' ) THEN INSERT INTO t_sys_log_y2016m09 VALUES (NEW .*) ; ELSEIF ( NEW .operation_time >= DATE '2016-10-01' AND NEW .operation_time < DATE '2016-11-01' ) THEN INSERT INTO t_sys_log_y2016m10 VALUES (NEW .*) ; ELSEIF ( NEW .operation_time >= DATE '2016-11-01' AND NEW .operation_time < DATE '2016-12-01' ) THEN INSERT INTO t_sys_log_y2016m11 VALUES (NEW .*) ; ELSEIF ( NEW .operation_time >= DATE '2016-12-01' AND NEW .operation_time < DATE '2017-01-01' ) THEN INSERT INTO t_sys_log_y2016m12 VALUES (NEW .*) ; ELSE RAISE EXCEPTION 'Date out of range!' ; END IF ; RETURN NULL ; END ; $$ LANGUAGE plpgsql;

最后再创建触发器用于执行刚才的Function:

CREATE TRIGGER sys_log_insert_trigger BEFORE INSERT ON t_sys_log_main FOR EACH ROW EXECUTE PROCEDURE sys_log_insert_trigger();

到这里就全部创建完成了,最后测试一下看看结果。为了确认我们的触发器的确触发了,我们打开存储过程的统计开关,在postgresql.conf中,找到track_functions,改成all:

这里写图片描述

接下来就可以运行几条测试insert语句来看看是否能把指定的时间记录分别插入到与其对应的分区子表中,插入之前先看下sys_log_insert_trigger()的统计信息:

这里写图片描述

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/1f0e21dbc1e12b18dd7a887c0b4ad4fa.html