注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

星期五

明天不上班

 
 
 

日志

 
 
关于我

一个特立独行的Java程序员,比较宅,上上网,写博客,听音乐,看电影。

网易考拉推荐

关于Postgresql Partition Table  

2012-05-17 19:20:33|  分类: Postgresql |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
对于上一篇如何创建Postgresql Partition Table 的trigger,Postgresql提供另一种方法去替代它,Partition Rules语法如下:
CREATE RULE table_2004_01_insert AS
ON INSERT TO table WHERE
( orderdate >= DATE '2004-01-01' AND orderdate < DATE '2004-02-01' )
DO INSTEAD
INSERT INTO table_2004_01 VALUES (NEW.*);
Rule的效率高于trigger

创建Partition Table的函数(根据日期创建分区表,规则:当time_stamp等于p_current_date时,数据插入分区表):

CREATE OR REPLACE FUNCTION create_partitions_tables(p_current_date character varying, p_table_name character varying)
RETURNS void AS
$BODY$
declare
v_sql_str varchar(1024);
v_table_name varchar(128);
v_partition_table_name varchar(128);
v_current_date varchar(16);
v_table_oid INT;
v_pk_oid INT;
v_pk_str varchar(1024) := '-';
v_pk_name varchar(128);
v_index_oid INT;
v_index_str varchar(1024)= '-';
v_index_name varchar(128);
v_count INT := 0;
v_rule_name varchar(128);

c_pk_column record;
c_indexs record;
c_index_column record;
BEGIN
--select to_char(current_date,'YYYYMMDD') into v_current_date;
v_current_date := p_current_date;
v_table_name := p_table_name;

-- create partition table
v_partition_table_name := v_table_name || '_' || v_current_date;
v_sql_str := 'CREATE TABLE ' || v_partition_table_name || '(
CHECK (date_trunc( ''day'', time_stamp) = DATE '''|| v_current_date ||''' )
) INHERITS ('||v_table_name||');';
execute v_sql_str;

-- get OID of table name
SELECT oid INTO v_table_oid FROM pg_class WHERE relname = v_table_name;

-- add PK for partion table
v_pk_str := '-';
SELECT conindid INTO v_pk_oid FROM pg_constraint WHERE conrelid = v_table_oid AND contype = 'p';
FOR c_pk_column IN
SELECT attname FROM pg_attribute WHERE attrelid = v_pk_oid
LOOP
v_pk_str := v_pk_str || ', ' ||c_pk_column.attname;
END LOOP;

IF v_pk_str != '-' THEN
SELECT SUBSTR(v_pk_str,3) INTO v_pk_str;
v_pk_name := v_partition_table_name ||'_pkey';
v_sql_str := 'ALTER TABLE '||v_partition_table_name||' ADD CONSTRAINT '||v_pk_name||' primary key ('||v_pk_str||');';
execute v_sql_str;
END IF;

--create index for partition table
v_count := 0;
FOR c_indexs IN SELECT indexrelid FROM pg_index WHERE indrelid = v_table_oid AND indisprimary != 't'
LOOP
v_index_str := '-';
v_index_oid := c_indexs.indexrelid;
FOR c_index_column IN SELECT attname FROM pg_attribute WHERE attrelid = v_index_oid
LOOP
v_index_str := v_index_str ||', '||c_index_column.attname;
END LOOP;
SELECT SUBSTR(v_index_str,3) INTO v_index_str;

v_index_name := v_partition_table_name||'_index_'||v_count;
v_sql_str := 'CREATE INDEX '||v_index_name||' ON '||v_partition_table_name||' ('||v_index_str||');';
execute v_sql_str;
v_count := v_count + 1;
END LOOP;

-- create rule for partition table
v_rule_name := v_partition_table_name||'_insert';
v_sql_str := 'CREATE RULE '||v_rule_name||' AS
ON INSERT TO '||v_table_name||' WHERE
( date_trunc( ''day'', time_stamp) = DATE '''|| v_current_date ||''')
DO INSTEAD
INSERT INTO '||v_partition_table_name||' VALUES (NEW.*)';
execute v_sql_str;

END;

$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;

-- Test

DROP TABLE hashvalue_PT;
CREATE TABLE hashvalue_PT
(
hash bytea NOT NULL,
time_stamp TIMESTAMP WITHOUT TIME zone NOT NULL,
primary key(hash, time_stamp)
);

select create_partitions_tables('20120517', 'hashvalue_pt');

  评论这张
 
阅读(728)| 评论(0)
推荐

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017