PostgreSQL分区表(创建分区)
在PostgreSQL分区表是很容易做到的,它涉及到PostgreSQL继承和触发的概念。在这里,提供了一个示例来演示如何在PostgreSQL上分区表。
之前进行,请了解一些基本的概念一样,呃......好我提供分区的概念,“time”在表中。
“Mother” — (Child1, Child2, Child3,Child4, Child5)
MasterTable — (Child_01_2008, Child_02_2008, Child_03_2008, Child_04_2008,Child_05_2008)
我们只有插入,选择,更新和删除MasterTable,所有子表是对用户透明。
For example when i insert a record into MasterTable which is at January 2008. Record will auto redirect (trigger) to child table (Child_01_2008). When user select a record from Master table, postgreSQL will automatically retrieve data from all child tables which inherited from MasterTable.
1)Create a simple table call “hashvalue_PT” , it only include 2 columns “hash” and “hashtime”
CREATE TABLE hashvalue_PT ( hash bytea NOT NULL, hashtime timestamp without time zone NOT NULL );
2) Create 10 tables in different months and inherantence from main hashvalue_PT table.
--Create Partition with check rule for validation CREATE TABLE hashvalue_PT_y2008m01 ( CHECK ( hashtime >= DATE '2008-01-01' AND hashtime < DATE '2008-01-31' ) ) INHERITS (hashvalue_PT); CREATE TABLE hashvalue_PT_y2008m02 ( CHECK ( hashtime >= DATE '2008-02-01' AND hashtime < DATE '2008-02-29' ) ) INHERITS (hashvalue_PT); CREATE TABLE hashvalue_PT_y2008m03 ( CHECK ( hashtime >= DATE '2008-03-01' AND hashtime < DATE '2008-03-31' ) ) INHERITS (hashvalue_PT); CREATE TABLE hashvalue_PT_y2008m04 ( CHECK ( hashtime >= DATE '2008-04-01' AND hashtime < DATE '2008-04-30' ) ) INHERITS (hashvalue_PT); CREATE TABLE hashvalue_PT_y2008m05 ( CHECK ( hashtime >= DATE '2008-05-01' AND hashtime < DATE '2008-05-31' ) ) INHERITS (hashvalue_PT); CREATE TABLE hashvalue_PT_y2008m06 ( CHECK ( hashtime >= DATE '2008-06-01' AND hashtime < DATE '2008-06-30' ) ) INHERITS (hashvalue_PT); CREATE TABLE hashvalue_PT_y2008m07 ( CHECK ( hashtime >= DATE '2008-07-01' AND hashtime < DATE '2008-07-31' ) ) INHERITS (hashvalue_PT); CREATE TABLE hashvalue_PT_y2008m08 ( CHECK ( hashtime >= DATE '2008-08-01' AND hashtime < DATE '2008-08-31' ) ) INHERITS (hashvalue_PT); CREATE TABLE hashvalue_PT_y2008m09 ( CHECK ( hashtime >= DATE '2008-09-01' AND hashtime < DATE '2008-09-30' ) ) INHERITS (hashvalue_PT); CREATE TABLE hashvalue_PT_y2008m010 ( CHECK ( hashtime >= DATE '2008-10-01' AND hashtime < DATE '2008-10-31' ) ) INHERITS (hashvalue_PT);
3) Create primary key for each child tables
ALTER TABLE hashvalue_PT_y2008m01 ADD CONSTRAINT hashvalue_PT_y2008m01_pkey PRIMARY KEY (hashtime, hash); ALTER TABLE hashvalue_PT_y2008m02 ADD CONSTRAINT hashvalue_PT_y2008m02_pkey PRIMARY KEY (hashtime, hash); ALTER TABLE hashvalue_PT_y2008m03 ADD CONSTRAINT hashvalue_PT_y2008m03_pkey PRIMARY KEY (hashtime, hash); ALTER TABLE hashvalue_PT_y2008m04 ADD CONSTRAINT hashvalue_PT_y2008m04_pkey PRIMARY KEY (hashtime, hash); ALTER TABLE hashvalue_PT_y2008m05 ADD CONSTRAINT hashvalue_PT_y2008m05_pkey PRIMARY KEY (hashtime, hash); ALTER TABLE hashvalue_PT_y2008m06 ADD CONSTRAINT hashvalue_PT_y2008m06_pkey PRIMARY KEY (hashtime, hash); ALTER TABLE hashvalue_PT_y2008m07 ADD CONSTRAINT hashvalue_PT_y2008m07_pkey PRIMARY KEY (hashtime, hash); ALTER TABLE hashvalue_PT_y2008m08 ADD CONSTRAINT hashvalue_PT_y2008m08_pkey PRIMARY KEY (hashtime, hash); ALTER TABLE hashvalue_PT_y2008m09 ADD CONSTRAINT hashvalue_PT_y2008m09_pkey PRIMARY KEY (hashtime, hash); ALTER TABLE hashvalue_PT_y2008m010 ADD CONSTRAINT hashvalue_PT_y2008m010_pkey PRIMARY KEY (hashtime, hash);
4) Create an index for each child tables
CREATE INDEX idx_hashvalue_PT_y2008m01_hashtime ON hashvalue_PT_y2008m01 (hashtime); CREATE INDEX idx_hashvalue_PT_y2008m02_hashtime ON hashvalue_PT_y2008m02 (hashtime); CREATE INDEX idx_hashvalue_PT_y2008m03_hashtime ON hashvalue_PT_y2008m03 (hashtime); CREATE INDEX idx_hashvalue_PT_y2008m04_hashtime ON hashvalue_PT_y2008m04 (hashtime); CREATE INDEX idx_hashvalue_PT_y2008m05_hashtime ON hashvalue_PT_y2008m05 (hashtime); CREATE INDEX idx_hashvalue_PT_y2008m06_hashtime ON hashvalue_PT_y2008m06 (hashtime); CREATE INDEX idx_hashvalue_PT_y2008m07_hashtime ON hashvalue_PT_y2008m07 (hashtime); CREATE INDEX idx_hashvalue_PT_y2008m08_hashtime ON hashvalue_PT_y2008m08 (hashtime); CREATE INDEX idx_hashvalue_PT_y2008m09_hashtime ON hashvalue_PT_y2008m09 (hashtime); CREATE INDEX idx_hashvalue_PT_y2008m010_hashtime ON hashvalue_PT_y2008m010 (hashtime);
5) Create a trigger on mother table to redirect records into child tables.
--create a trigger to redirect records to child table CREATE OR REPLACE FUNCTION hashvalue_PT_func_insert_trigger() RETURNS TRIGGER AS $$ BEGIN IF ( NEW.hashtime >= DATE '2008-01-01' AND NEW.hashtime < DATE '2008-01-31' ) THEN INSERT INTO hashvalue_PT_y2008m01 VALUES (NEW.*); ELSIF ( NEW.hashtime >= DATE '2008-02-01' AND NEW.hashtime < DATE '2008-02-29' ) THEN INSERT INTO hashvalue_PT_y2008m02 VALUES (NEW.*); ELSIF ( NEW.hashtime >= DATE '2008-03-01' AND NEW.hashtime < DATE '2008-03-31' ) THEN INSERT INTO hashvalue_PT_y2008m03 VALUES (NEW.*); ELSIF ( NEW.hashtime >= DATE '2008-04-01' AND NEW.hashtime < DATE '2008-04-30' ) THEN INSERT INTO hashvalue_PT_y2008m04 VALUES (NEW.*); ELSIF ( NEW.hashtime >= DATE '2008-05-01' AND NEW.hashtime < DATE '2008-05-31' ) THEN INSERT INTO hashvalue_PT_y2008m05 VALUES (NEW.*); ELSIF ( NEW.hashtime >= DATE '2008-06-01' AND NEW.hashtime < DATE '2008-06-30' ) THEN INSERT INTO hashvalue_PT_y2008m06 VALUES (NEW.*); ELSIF ( NEW.hashtime >= DATE '2008-07-01' AND NEW.hashtime < DATE '2008-07-31' ) THEN INSERT INTO hashvalue_PT_y2008m07 VALUES (NEW.*); ELSIF ( NEW.hashtime >= DATE '2008-08-01' AND NEW.hashtime < DATE '2008-08-31' ) THEN INSERT INTO hashvalue_PT_y2008m08 VALUES (NEW.*); ELSIF ( NEW.hashtime >= DATE '2008-09-01' AND NEW.hashtime < DATE '2008-09-30' ) THEN INSERT INTO hashvalue_PT_y2008m09 VALUES (NEW.*); ELSIF ( NEW.hashtime >= DATE '2008-10-01' AND NEW.hashtime < DATE '2008-10-31' ) THEN INSERT INTO hashvalue_PT_y2008m010 VALUES (NEW.*); ELSE RAISE EXCEPTION 'Date out of range. Fix the measurement_insert_trigger() function!'; END IF; RETURN NULL; END; $$ LANGUAGE plpgsql; CREATE TRIGGER trigger_hashvalue_PT_insert BEFORE INSERT ON hashvalue_PT FOR EACH ROW EXECUTE PROCEDURE hashvalue_PT_func_insert_trigger();
6) Done, Simple
Next Session i will create a function to insert million of data from partition table to test performance between partition and non partition table. Please visit Partition Table In PostgreSQL (Simulate Millions Data) – Part 2
标签:PostgreSQL 分区表 创建分区
欢迎任何形式的转载,但请务必注明出处,尊重他人劳动共创优秀实例教程
转载请注明:文章转载自:易百教程 [http:/www.yiibai.com]
本文标题:PostgreSQL分区表(创建分区)
本文地址:http://www.yiibai.com/article/partition-table-in-postgresql-create-partition-part-1.html