RE' THEN
RETURN NULL;
END IF;
--Generate Table Name
str_sub_sample_time = date_part('year',NEW.sample_time)::varchar || '_' ||
CASE WHEN date_part('month',NEW.sample_time) <10 THEN '0' ELSE '' END
||date_part('month',NEW.sample_time)::varchar;
str_sub_tablename = 'machine2_' || str_sub_sample_time;
--Check if table not created
select * from pg_tables where schemaname = 'public' and tablename=str_sub_
tablename
into str_sql_cmd;
IF NOT FOUND THEN
--Create table Cmd
str_sql_cmd = '
CREATE TABLE '||str_sub_tablename||'
(
CONSTRAINT pk_'|| str_sub_tablename||' PRIMARY KEY (id ),
CONSTRAINT chk_'|| str_sub_tablename||'
CHECK(date_part(''year''::text, sample_time) = '||
date_part('year',NEW.sample_time)::varchar||
'::double precision AND
date_part(''month''::text, sample_time) = '||
date_part('month',NEW.sample_time)::varchar||'
)
)
INHERITS (base_table_machine2)
WITH ( OIDS=FALSE );
ALTER TABLE '||str_sub_tablename||' OWNER TO postgres;
CREATE INDEX idx_'|| str_sub_tablename||'_sample_time
ON '|| str_sub_tablename||'
USING btree (sample_time );
';
EXECUTE str_sql_cmd;
END IF;
--insert Data
str_sql_cmd = 'INSERT INTO '||str_sub_tablename||'
( id,dvalue,sample_time,machine_code,manu_id,manu_value) VALUES (
nextval(''serial_id_seq''),$1,$2,$3,$4,$5);
';
EXECUTE str_sql_cmd USING
NEW.dvalue,
NEW.sample_time,
NEW.machine_code,
NEW.manu_id,
NEW.manu_value;
--return null because main table does not really contain data
return NULL;
END;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
ALTER FUNCTION on_insert_base_table_machine2()
OWNER TO postgres;
最后,为各个爸爸表设置触发器
-
CREATE TRIGGER triggle_on_insert_machine1
-
BEFORE INSERT
-
ON base_table_machine1
-
FOR EACH ROW
-
EXECUTE PROCEDURE on_insert_base_table_machine1();
-
CREATE TRIGGER triggle_machine2
-
BEFORE INSERT
-
ON base_table_machine2
-
FOR EACH ROW
-
EXECUTE PROCEDURE on_insert_base_table_machine2();
到此为止,我们可以分别向各个爸爸表(按类型分区表)插入数据,而后通过爷爷表(总表)
检索基本信息,通过爸爸表检索详细信息。对总表的操作会遍历反馈到所有子表,试图利用子表的
索引进行查询。由于按月存储,插入工作只限于本月,所以检索历史数据效率很高。
当然了,这只是简单的实验,实际字段要比上述字段复杂很多。PostgreSQL的对象-关系
数据库对解
决上述问题非常有帮助,也全面的运用到我公司的各个环节,达到工业化标准的
系统非常稳定,尽管
设置了备份,但4年来从未真正用到。我们目前使用 16核心机架服务器,8GB内存,Ubuntu 12.04
LTS,优化配置(Postgresql.conf) 采用设置共享段shared_buffers 512MB, work_mem 32MB,维护maintenance_work_m