PostgreSQLのパーティションテーブル(パーティションの作成)–パート1
PostgreSQLのパーティションテーブルは非常に簡単に実行できます。これには、PostgreSQLの継承の概念とトリガーが含まれます。 ここでは、PostgreSQLでテーブルをパーティション分割する方法を示すサンプルを提供します。
先に進む前に、次のような基本概念を理解してください。…テーブルのパーティション「時間」の概念を提供する方が良いでしょう。
「母」—(Child1、Child2、Child3、Child4、Child5)
MasterTable —(Child_01_2008、Child_02_2008、Child_03_2008、Child_04_2008、Child_05_2008)
MasterTableでの挿入、選択、更新、削除のみを行います。すべての子テーブルはユーザーに対して透過的です。
たとえば、2008年1月のMasterTableにレコードを挿入するとします。 レコードは子テーブル(Child_01_2008)に自動的にリダイレクト(トリガー)します。 ユーザーがマスターテーブルからレコードを選択すると、postgreSQLはMasterTableから継承したすべての子テーブルからデータを自動的に取得します。
1)「hashvalue_PT」という単純なテーブルを作成します。このテーブルには「hash」と「hashtime」の2つの列しか含まれていません。
CREATE TABLE hashvalue_PT ( hash bytea NOT NULL, hashtime timestamp without time zone NOT NULL );
2)メインのhashvalue_PTテーブルから異なる月と継承で10個のテーブルを作成します。
--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)各子テーブルの主キーを作成します
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 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 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)完了、シンプル
次のセッションiでは、パーティションテーブルから無数のデータを挿入して、パーティションテーブルと非パーティションテーブル間のパフォーマンスをテストする関数を作成します。 Partition Table In PostgreSQL (Simulate Millions Data) – Part 2にアクセスしてください