PostgreSQL maakt partitionering op twee verschillende manieren mogelijk. De ene is op bereik en de andere op lijst. Beide gebruiken tabelovererving om partities uit te voeren.
Partitionering op bereik, meestal een datumbereik, komt het meest voor, maar partitionering op lijst kan handig zijn als de variabelen die de partitie vormen statisch en niet scheef zijn.
Partitionering wordt gedaan met tabelovererving, dus het eerste dat u moet doen, is nieuwe onderliggende tabellen instellen.
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);
Dan moeten er regels of triggers worden gebruikt om de gegevens in de juiste tabellen te plaatsen. Regels zijn sneller bij bulkupdates, triggers bij afzonderlijke updates en zijn gemakkelijker te onderhouden. Hier is een voorbeeldtrigger.
CREATE TRIGGER insert_measurement_trigger
BEFORE INSERT ON measurement
FOR EACH ROW EXECUTE PROCEDURE measurement_insert_trigger();
en de triggerfunctie om het invoegen te doen
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;
Deze voorbeelden zijn vereenvoudigde versies van de postgresql-documentatie voor gemakkelijker lezen.
Ik ben niet bekend met pgpool2, maar gridsql is een commercieel product dat is ontworpen voor EnterpriseDB, een commerciële database die bovenop postgresql is gebouwd. Hun producten zijn erg goed, maar ik denk niet dat het zal werken op standaard postgresl.