PostgreSql Partition + Hibernate Insert
来源:互联网 发布:中国网络经纪人 编辑:程序博客网 时间:2024/06/10 07:58
与Oracle不同,PostgreSQL需要手动控制分区规则触发器。
步骤一:创建分区
CREATE TABLE table_partition_1( CHECK partition_column criteria) INHENRITS (table)
步骤二:为分区表创建PK跟index,这里使用btree
ALTER TABLE ONLY table_partition_1 ADD CONSTRAINT table_partition_1_pkey PRIMARY KEY (key_column);
CREATE INDEX index_table_partition_1 ON table_partition_1 USING btree(column);
步骤三:手动创建触发器
CREATE OR REPLACE FUNCTION before_insert_table() RETURNS trigger AS$BODY$ DECLARE BEGINif criteria thenEXECUTE 'insert into appropriate table ...' SELECT ($1).* ' USING NEW;end if;return null;END;$BODY$ LANGUAGE plpgsql VOLATILE COST 100;ALTER FUNCTION before_insert_table() OWNER TO db;
rule在批量操作时更合适,但是对于单独操作会占用较大的开销。
CREATE RULE table_partition_1 _insert AS(criteria ...)DO INSTEAD INSERT INTO table_partition_1 VALUES (NEW.*)
步骤四:触发器方式hibernate向分区插入数据时,获得的result count为0,会导致判断失败而回滚。
解决方法是使用rule,或者声明分区插入时不进行result检查。
@SQLInsert(sql = "INSERT INTO "+ "table(column,...)"+ " VALUES(?,...)", check = ResultCheckStyle.NONE)
在Java项目中,考虑到分区创建会采用job方式自动创建,可以通过function完成创建。
CREATE OR REPLACE FUNCTION "public"."function"() RETURNS void AS $BODY$ DECLARE _tablename text ; quarter integer;record1 record; BEGINselect function(now()) as quarter into record1; quarter := record1.quarter;_tablename := 'partition_name';PERFORM 1FROM pg_catalog.pg_class cWHERE c.relname = _tablename;IF FOUND <> TRUE THENEXECUTE 'CREATE TABLE ' || _tablename || ' ( CHECK ( criteria) ) INHERITS (table)';EXECUTE 'ALTER TABLE ' || _tablename || ' OWNER TO db ';EXECUTE ' alter table ' || _tablename || ' add CONSTRAINT ' || _tablename||'_pkey PRIMARY key (column) ' ;EXECUTE ' CREATE INDEX ' || _tablename|| '_indexON '|| _tablename ||'USING btree(column)'; END IF;END$BODY$ LANGUAGE 'plpgsql' VOLATILE COST 100;ALTER FUNCTION "public"."function"() OWNER TO "db";
参考资料:
entity-hibspec-customsql.html
postgresql-table-partitioning-hibernate.html
0 0
- PostgreSql Partition + Hibernate Insert
- postgresql insert
- batch insert in PostgreSQL
- hibernate insert
- postgresql insert语句中用select
- postgresql insert inet类型字段
- PostgreSQL partition table's arithmetic tuning example
- PostgreSQL general public partition table trigger
- hibernate batch insert
- hibernate模拟实现insert
- postgresql : hibernate.cfg.xml
- PostgreSQL,Hibernate,hstore
- hibernate 连接postgresql数据库
- PostgreSQL 实现MySQL "insert ignore" 语法。
- PostgreSQL zhparser & english parser, query, insert performance
- PostgreSQL数据导出成Insert语句
- Partition-方案二:通过 Insert with a subquery 方法
- Compare Oracle's & PostgreSQL's Partition Table write performance
- 第二次签到
- Mac OS X下安装sublime text 3破解并支持GBK、GB2312
- POJ2299——Ultra-QuickSort(归并排序)
- 2030 汉字统计
- (andriod)记录 cocos2dx ios&android遇到的一些注意问题
- PostgreSql Partition + Hibernate Insert
- 2031 进制转换
- Hadoop,Hbase,Zookeeper在虚拟机单节点中的整合
- Android开发记录六之WiFi操作的使用方法
- Node.js入门简述
- Android_Fragment_Fragment详解
- C++11中的右值引用及move语义编程
- windows 下 线程封装
- Windows下如何删除都被占用的串口