PostgreSQL tillader partitionering på to forskellige måder. Den ene er efter rækkevidde, og den anden er efter liste. Begge bruger tabelarv til at udføre partitionering.
Partitionering efter interval, normalt et datointerval, er det mest almindelige, men partitionering efter liste kan være nyttig, hvis de variabler, der er partitionen, er statiske og ikke skæve.
Partitionering udføres med tabelnedarvning, så den første ting at gøre er at oprette nye underordnede 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);
Så skal enten regler eller triggere bruges til at droppe dataene i de korrekte tabeller.Regler er hurtigere på masseopdateringer, triggere på enkelte opdateringer samt er nemmere at vedligeholde. Her er en prøveudløser.
CREATE TRIGGER insert_measurement_trigger
BEFORE INSERT ON measurement
FOR EACH ROW EXECUTE PROCEDURE measurement_insert_trigger();
og triggerfunktionen til at udføre indsættelsen
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;
Disse eksempler er forenklede versioner af postgresql-dokumentationen for lettere læsning.
Jeg er ikke bekendt med pgpool2, men gridsql er et kommercielt produkt designet til EnterpriseDB, en kommerciel database, der er bygget oven på postgresql. Deres produkter er meget gode, men jeg tror ikke, at det vil fungere på standard postgresl.