PostgreSQL umożliwia partycjonowanie na dwa różne sposoby. Jeden jest według zakresu, a drugi według listy. Oba używają dziedziczenia tabeli do partycjonowania.
Podział według zakresu, zwykle zakresu dat, jest najbardziej powszechny, ale partycjonowanie według listy może być przydatne, jeśli zmienne stanowiące partycję są statyczne i nie są przekrzywione.
Partycjonowanie odbywa się za pomocą dziedziczenia tabeli, więc pierwszą rzeczą do zrobienia jest skonfigurowanie nowych tabel podrzędnych.
CREATE TABLE measurement (
x int not null,
y date not null,
z int
);
CREATE TABLE measurement_y2006 (
CHECK ( logdate >= DATE '2006-01-01' AND logdate < DATE '2007-01-01' )
) INHERITS (measurement);
CREATE TABLE measurement_y2007 (
CHECK ( logdate >= DATE '2007-01-01' AND logdate < DATE '2008-01-01' )
) INHERITS (measurement);
Następnie należy użyć reguł lub wyzwalaczy, aby umieścić dane w odpowiednich tabelach. Reguły są szybsze w przypadku aktualizacji zbiorczych, wyzwalacze w przypadku pojedynczych aktualizacji, a także są łatwiejsze w utrzymaniu. Oto przykładowy wyzwalacz.
CREATE TRIGGER insert_measurement_trigger
BEFORE INSERT ON measurement
FOR EACH ROW EXECUTE PROCEDURE measurement_insert_trigger();
i funkcja wyzwalacza do wstawiania
CREATE OR REPLACE FUNCTION measurement_insert_trigger()
RETURNS TRIGGER AS $$
BEGIN
IF ( NEW.logdate >= DATE '2006-01-01'
AND NEW.logdate < DATE '2007-01-01' ) THEN
INSERT INTO measurement_y2006 VALUES (NEW.*);
ELSIF ( NEW.logdate >= DATE '2007-01-01'
AND NEW.logdate < DATE '2008-01-01' ) THEN
INSERT INTO measurement_y2006m03 VALUES (NEW.*);
ELSE
RAISE EXCEPTION 'Date out of range.';
END IF;
RETURN NULL;
END;
$$
LANGUAGE plpgsql;
Te przykłady to uproszczone wersje dokumentacji postgresql dla łatwiejszego czytania.
Nie znam pgpool2, ale gridsql to komercyjny produkt zaprojektowany dla EnterpriseDB, komercyjnej bazy danych zbudowanej na postgresql. Ich produkty są bardzo dobre, ale nie sądzę, że będzie działać na standardowym postgreslu.