Таблица разделов в PostgreSQL (создание раздела) - часть 1
Таблицу разделов в PostgreSQL очень легко сделать, она включает в себя концепцию наследования и триггер PostgreSQL. Здесь я приведу пример, чтобы продемонстрировать, как разбить таблицу в PostgreSQL.
Прежде чем продолжить, пожалуйста, поймите некоторую базовую концепцию, например, э… лучше я приведу концепцию раздела «время» в таблице.
«Мать» - (Ребенок 1, Ребенок 2, Ребенок 3, Ребенок 4, Ребенок 5)
MasterTable - (Child_01_2008, Child_02_2008, Child_03_2008, Child_04_2008, Child_05_2008)
Мы только вставляем, выбираем, обновляем и удаляем в MasterTable, все дочерние таблицы прозрачны для пользователя.
Например, когда я вставляю запись в MasterTable, которая находится в январе 2008 года. Запись будет автоматически перенаправлена (триггер) на дочернюю таблицу (Child_01_2008). Когда пользователь выбирает запись из главной таблицы, postgreSQL автоматически извлекает данные из всех дочерних таблиц, которые унаследованы от MasterTable.
1) Создайте простой вызов таблицы «hashvalue_PT», он включает только 2 столбца «hash» и «hashtime».
CREATE TABLE hashvalue_PT ( hash bytea NOT NULL, hashtime timestamp without time zone NOT NULL );
2) Создайте 10 таблиц в разные месяцы и наследственность из основной таблицы hashvalue_PT.
--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) Готово, просто
В следующем сеансе я создам функцию для вставки миллионов данных из таблицы разделов для проверки производительности между разделами и без разделов. ПосетитеPartition Table In PostgreSQL (Simulate Millions Data) – Part 2