PostgreSQL tillåter partitionering på två olika sätt. En är efter intervall och den andra är efter lista. Båda använder tabellarv för att göra partition.
Partitionering efter intervall, vanligtvis ett datumintervall, är det vanligaste, men partitionering efter lista kan vara användbart om variablerna som är partitionen är statiska och inte skeva.
Partitionering görs med tabellärvning så det första du ska göra är att skapa nya underordnade tabeller.
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);
Då måste antingen regler eller utlösare användas för att släppa data i rätt tabeller. Reglerna är snabbare vid massuppdateringar, utlöser på enstaka uppdateringar samt är lättare att underhålla. Här är ett exempel på trigger.
CREATE TRIGGER insert_measurement_trigger
BEFORE INSERT ON measurement
FOR EACH ROW EXECUTE PROCEDURE measurement_insert_trigger();
och triggerfunktionen för att infoga
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;
Dessa exempel är förenklade versioner av postgresql-dokumentationen för enklare läsning.
Jag är inte bekant med pgpool2, men gridsql är en kommersiell produkt designad för EnterpriseDB, en kommersiell databas som är byggd ovanpå postgresql. Deras produkter är väldigt bra, men jag tror inte att det kommer att fungera på standard postgresl.