PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

qual é uma boa maneira de fragmento horizontal no postgresql


O PostgreSQL permite particionar de duas maneiras diferentes. Um é por intervalo e o outro é por lista. Ambos usam herança de tabela para fazer partição.
Particionar por intervalo, geralmente um intervalo de datas, é o mais comum, mas particionar por lista pode ser útil se as variáveis ​​que compõem a partição forem estáticas e não distorcidas.

O particionamento é feito com herança de tabela, então a primeira coisa a fazer é configurar novas tabelas filhas.
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);

Em seguida, regras ou gatilhos precisam ser usados ​​para descartar os dados nas tabelas corretas. As regras são mais rápidas em atualizações em massa, gatilhos em atualizações únicas, além de serem mais fáceis de manter. Aqui está um exemplo de gatilho.
CREATE TRIGGER insert_measurement_trigger
    BEFORE INSERT ON measurement
    FOR EACH ROW EXECUTE PROCEDURE measurement_insert_trigger();

e a função trigger para fazer a inserção
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;

Esses exemplos são versões simplificadas da documentação do postgresql para facilitar a leitura.

Não estou familiarizado com o pgpool2, mas o gridsql é um produto comercial projetado para EnterpriseDB, um banco de dados comercial construído sobre o postgresql. Seus produtos são muito bons, mas não acho que funcione no postgresl padrão.