Postgresql 添加分区表(按月和按日通用)

建了分区表的同学相信添加分区表很头疼,如果有按月分区又有按日分区的,而且是通过"_yyyymmdd"或者"_yyyymm"后缀进行分区的,那么可以用这个函数进行添加分区

CREATE OR REPLACE FUNCTION f_add_partition()

RETURNS void

LANGUAGE plpgsql

AS $function$

declare

v_max_childname text;  --最大子表名称

v_parentname text;  --子表对应的父表名称

v_suffix text;  --子表日期后缀

sql text; --要执行的SQL语句

GRA_TO text;   --赋予权限的语句

begin

--取出分区表最大分区表以及父表名称

for v_max_childname, v_parentname in select max(inhrelid::regclass::text),inhparent::regclass from pg_inherits where  inhparent::regclass::text not like ‘%.%‘ group by inhparent

loop

raise notice ‘最大子表:%,父表:%‘,v_max_childname,v_parentname;

sql= ‘select split_part(‘‘‘|| v_max_childname  || ‘‘‘,‘‘_‘‘,(length(‘‘‘ || v_max_childname || ‘‘‘)-length(replace(‘‘‘ || v_max_childname || ‘‘‘,‘‘_‘‘,‘‘‘‘))+1))‘;   --取出日期是按月还是按日

execute sql into v_suffix;      --将取出的日期存入v_suffix

while(length(v_suffix)=6 and v_suffix<‘201512‘)  --判断如果是按月,那么循环执行建表语句并且赋予权限

loop

v_suffix=to_char (to_timestamp(v_suffix,‘yyyymm‘)+interval ‘1 month‘,‘yyyymm‘) ; --在取出的分区表日期按月+1

sql= ‘create table ‘||v_parentname ||‘_‘||v_suffix || ‘(like ‘ || v_parentname ||‘ including all)  inherits (‘|| v_parentname ||‘)‘;

execute sql;

for GRA_TO in execute ‘select ‘‘grant ‘‘||privilege_type||‘‘ on ‘||v_parentname||‘_‘||v_suffix ||‘ to ‘‘||grantee from information_schema.table_privileges where table_name=‘‘‘||v_max_childname||‘‘‘‘ loop

execute GRA_TO;

end loop;

end loop;

while(length(v_suffix)=8 and v_suffix<‘20151231‘)  --判断如果是按日分区,循环执行后面的建表语句并且赋予权限

loop

v_suffix=to_char (to_timestamp(v_suffix,‘yyyymmdd‘)+interval ‘1 day‘,‘yyyymmdd‘) ;

sql= ‘create table ‘||v_parentname||‘_‘||v_suffix || ‘(like ‘ || v_parentname ||‘ including all)  inherits (‘|| v_parentname ||‘)‘;

execute sql;

for GRA_TO in execute ‘select ‘‘grant ‘‘||privilege_type||‘‘ on ‘||v_parentname||‘_‘||v_suffix||‘ to ‘‘||grantee from information_schema.table_privileges where table_name=‘‘‘||v_max_childname||‘‘‘‘ loop

execute GRA_TO;

end loop;

end loop;

end loop;

RAISE NOTICE ‘Partition table has be created successfully!‘;

end;

$function$

\dt

hank   | tbl              | table | hank

hank   | tbl_20140322     | table | hank

hank   | test             | table | hank

hank   | test_201405      | table | hank

select f_add_partition();

\dt

hank   | tbl              | table | hank

hank   | tbl_20140322     | table | hank

按日分区的显示太多,此处省略一万行。。。。。

hank   | tbl_20151230     | table | hank

hank   | tbl_20151231     | table | hank

按月的比较少,就全部贴出来了

hank   | test             | table | hank

hank   | test_201405      | table | hank

hank   | test_201406      | table | hank

hank   | test_201407      | table | hank

hank   | test_201408      | table | hank

hank   | test_201409      | table | hank

hank   | test_201410      | table | hank

hank   | test_201411      | table | hank

hank   | test_201412      | table | hank

hank   | test_201501      | table | hank

hank   | test_201502      | table | hank

hank   | test_201503      | table | hank

hank   | test_201504      | table | hank

hank   | test_201505      | table | hank

hank   | test_201506      | table | hank

hank   | test_201507      | table | hank

hank   | test_201508      | table | hank

hank   | test_201509      | table | hank

hank   | test_201510      | table | hank

hank   | test_201511      | table | hank

hank   | test_201512      | table | hank

时间: 2024-10-10 09:21:20

Postgresql 添加分区表(按月和按日通用)的相关文章

PostgreSQL添加新服务器连接时,报错“Server doesn&#39;t listen ”,已解决。

PostgreSQL添加新的服务器连接时,报错: 解决方法: 第一步:修改配置文件中连接的服务器列表,添加服务器IP地址(图pg002.png) 配置文件地址:数据库右击属性,打开数据库的安装路径在data文件中找到配置文件pg_hba.conf. 如:D:\Program Files\PostgreSQL\9.4\data\pg_hba.conf 注:只要修改IP路径就可以了,‘/’后面的数字都为32. 第二步:修改配置文件后,启动服务器的服务: 启动服务完成,连接服务器,新服务器就可以正常的

PostgreSQL 添加各种约束语法

转自 PostgreSQL 添加各种约束语法   1. 添加主键 alter table goods add primary key(sid); 2. 添加外键 alter table orders add foreign key(goods_id) references goods(sid)  on update cascade on delete cascade; on update cascade: 被引用行更新时,引用行自动更新: on update restrict: 被引用的行禁止更

PostgreSQL 创建分区表(转 仅供自己参考)

典型使用场景 随着使用时间的增加,数据库中的数据量也不断增加,因此数据库查询越来越慢. 加速数据库的方法很多,如添加特定的索引,将日志目录换到单独的磁盘分区,调整数据库引擎的参数等.这些方法都能将数据库的查询性能提高到一定程度. 对于许多应用数据库来说,许多数据是历史数据并且随着时间的推移它们的重要性逐渐降低.如果能找到一个办法将这些可能不太重要的数据隐藏,数据库查询速度将会大幅提高.可以通过DELETE来达到此目的,但同时这些数据就永远不可用了. 因此,需要一个高效的把历史数据从当前查询中隐藏

【PostgreSQL】分区表

PostgreSQL中的分区表是通过表继承来实现的(表继承博客http://www.cnblogs.com/NextAction/p/7366607.html).创建分区表的步骤如下: (1)创建“父表”,所有的分区表都从这张表继承.“父表”中不存数据,也不要定义约束和索引. (2)创建“子表”,所有“子表”都是从“父表”中继承而来.这些“子表”就是所谓的分区,其实它们也是PostgreSQL表. (3)给分区表创建约束. (4)在分区表上创建索引. (5)创建触发器,把对“父表”的插入重定向到

PostgreSQL之分区表(partitioning)

PostgreSQL有一项非常有用的功能,分区表,或者partitioning.当某个TABLE的记录非常的多,千万甚至更多的时候,我们其实需要将他分割成子表.一个庞大的TABLE,就像水果仓库杂乱无章地堆放着无数的苹果桃子和桔子,查找不方便,性能降低,比较合理的做法是将仓库分成三个子区域,分表放苹果桃子和桔子.一张大表就变成了三个小表的集合. 通过合理的设计,可以将选择一定的规则,将大表切分多个不重不漏的子表,这就是传说中的partitioning.比如,我们可以按时间切分,每天一张子表,比如

给PostgreSQL添加MySQL的unix_timestamp与from_unixtime函数

MySQL的2个常用函数unix_timestamp()与from_unixtime PostgreSQL并不提供,但通过PostgreSQL强大的扩展性可以轻松的解决问题. 话说远在天边,尽在眼前,文档看仔细,问题迎仞解.PostgreSQL 题供extract与date_part取epoch即可即unix_timestamp() = round(date_part(’epoch’,now()))from_unixtime(int) = to_timestamp(int) 添加函数unix_t

PostgreSQL PARTITION 分区表

PostgreSQL 分区表,操作性相当便捷. 但只能在创建时决定是否为分区表,并决定分区条件字段,普通表创建后,不能在修改为分区表. Note:通过其他方法也可转化为分区表. 和其他数据库一样,分区表作为一个DB的特性,优点自不用说,物理分散,逻辑统一. 必须要注意的一个缺点是:分区表不允许其他表作为外键引用.只能在真实场景业务逻辑上当作外键,设计时论场景再推敲. 同时,在Pg 11以前只能单独为每个分区表建立索引等,且不能在[母表]上建立主键.索引等. Pg 11以后可以针对"逻辑"

postgreSQL添加uuid功能

1. pg默认时不带uuid支持,需要手工添加 2.软件编译时带上uuid支持: --with-uuid=e2fs(这里有三种选择,bsd,e2fs,ossp). 需号要先安装依赖包 libuuid-devel.x86_64 3.进入源代码目录里的contrib目录,该目录存放的时没有被放入核心里的功能,类似plugin.需要全部都编译,就在该目录下make一下即可.如果需要单独某些包,进入相应目录,我们这里需要进入uuid-ossp目录,然后执行make && make install

PostgreSQL的分区表建立

在数据库日渐庞大的时候,为了方便对数据库数据的管理,比如按时间,按地区去统计一些数据时,基数过于庞大,多有不便.很多商业数据库都提供分区的概念,按不同的维度去存放数据,便于后期的管理,PG也不例外.下面是分区表创建步骤: 1.建立主表 create table parent_table( id int, name character varying(20), create_time timestamp without time zone); 2.建立子表,继承于主表 create table p