sql >> Base de Datos >  >> RDS >> PostgreSQL

¿Cuál es una buena manera de fragmento horizontal en postgresql?

PostgreSQL permite particionar de dos maneras diferentes. Uno es por rango y el otro es por lista. Ambos usan la herencia de tablas para hacer particiones.
La partición por rango, generalmente un rango de fechas, es la más común, pero la partición por lista puede ser útil si las variables que forman la partición son estáticas y no sesgadas.

El particionamiento se realiza con la herencia de tablas, por lo que lo primero que debe hacer es configurar nuevas tablas secundarias.

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

Luego, se deben usar reglas o disparadores para colocar los datos en las tablas correctas. Las reglas son más rápidas en las actualizaciones masivas, los disparadores en las actualizaciones individuales, además de ser más fáciles de mantener. Aquí hay un disparador de muestra.

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

y la función de disparo para hacer la inserción

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;

Estos ejemplos son versiones simplificadas de la documentación de postgresql para facilitar la lectura.

No estoy familiarizado con pgpool2, pero gridsql es un producto comercial diseñado para EnterpriseDB, una base de datos comercial que se basa en postgresql. Sus productos son muy buenos, pero no creo que funcionen en postgresl estándar.