Partitionstabelle in PostgreSQL (Partition erstellen) - Teil 1

Partitionstabelle in PostgreSQL (Partition erstellen) - Teil 1

Die Partitionstabelle in PostgreSQL ist sehr einfach zu erstellen. Sie beinhaltet das Vererbungskonzept und den Auslöser von PostgreSQL. Hier stelle ich ein Beispiel zur Verfügung, um zu demonstrieren, wie man Tabellen in PostgreSQL partitioniert.

Bevor Sie fortfahren, verstehen Sie bitte ein grundlegendes Konzept wie, äh, besser, ich gebe ein Konzept der Partition "Zeit" in einer Tabelle.

"Mutter" - (Kind1, Kind2, Kind3, Kind4, Kind5)

MasterTable - (Child_01_2008, Child_02_2008, Child_03_2008, Child_04_2008, Child_05_2008)

Wir fügen nur MasterTable ein, wählen es aus, aktualisieren es und löschen es. Alle untergeordneten Tabellen sind für den Benutzer transparent.

Zum Beispiel, wenn ich einen Datensatz in MasterTable einfüge, der im Januar 2008 ist. Der Datensatz wird automatisch zur untergeordneten Tabelle (Child_01_2008) umgeleitet (ausgelöst). Wenn der Benutzer einen Datensatz aus der Master-Tabelle auswählt, ruft postgreSQL automatisch Daten aus allen untergeordneten Tabellen ab, die von MasterTable geerbt wurden.

1) Erstellen Sie einen einfachen Tabellenaufruf "hashvalue_PT", der nur 2 Spalten "hash" und "hashtime" enthält.

CREATE TABLE hashvalue_PT
(
  hash bytea NOT NULL,
  hashtime timestamp without time zone NOT NULL
);

2) Erstellen Sie 10 Tabellen in verschiedenen Monaten und erben Sie sie aus der Haupttabelle 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) Erstellen Sie einen Primärschlüssel für jede untergeordnete Tabelle

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) Erstellen Sie einen Index für jede untergeordnete Tabelle

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) Erstellen Sie einen Trigger für die Muttertabelle, um Datensätze in untergeordnete Tabellen umzuleiten.

--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) Fertig, einfach

In der nächsten Sitzung erstelle ich eine Funktion zum Einfügen von Millionen von Daten aus der Partitionstabelle, um die Leistung zwischen der Partitionstabelle und der Nicht-Partitionstabelle zu testen. Bitte besuchen SiePartition Table In PostgreSQL (Simulate Millions Data) – Part 2