PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Was ist ein guter Weg zum horizontalen Shard in Postgresql

PostgreSQL ermöglicht die Partitionierung auf zwei verschiedene Arten. Einer ist nach Bereich und der andere nach Liste. Beide verwenden Tabellenvererbung zur Partitionierung.
Die Partitionierung nach Bereich, normalerweise ein Datumsbereich, ist am häufigsten, aber die Partitionierung nach Liste kann nützlich sein, wenn die Variablen, die die Partition bilden, statisch und nicht verzerrt sind.

Die Partitionierung erfolgt mit Tabellenvererbung, also müssen als erstes neue untergeordnete Tabellen eingerichtet werden.

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);

Dann müssen entweder Regeln oder Trigger verwendet werden, um die Daten in den richtigen Tabellen abzulegen. Regeln sind bei Massenaktualisierungen schneller, Trigger bei Einzelaktualisierungen und außerdem einfacher zu warten. Hier ist ein Beispiel-Trigger.

CREATE TRIGGER insert_measurement_trigger
    BEFORE INSERT ON measurement
    FOR EACH ROW EXECUTE PROCEDURE measurement_insert_trigger();

und die Trigger-Funktion, um das Einfügen auszuführen

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;

Diese Beispiele sind vereinfachte Versionen der Postgresql-Dokumentation zum leichteren Lesen.

Ich bin mit pgpool2 nicht vertraut, aber gridsql ist ein kommerzielles Produkt, das für EnterpriseDB entwickelt wurde, eine kommerzielle Datenbank, die auf postgresql aufbaut. Ihre Produkte sind sehr gut, aber ich glaube nicht, dass es auf Standard-Postgresl funktionieren wird.