sql >> データベース >  >> RDS >> PostgreSQL

postgresqlで水平シャードを作成する良い方法は何ですか

    PostgreSQLでは、2つの異なる方法でパーティショニングが可能です。 1つは範囲によるもので、もう1つはリストによるものです。どちらもテーブルの継承を使用してパーティションを作成します。
    範囲によるパーティション化(通常は日付範囲)が最も一般的ですが、パーティションである変数が静的でスキューされていない場合は、リストによるパーティション化が役立ちます。

    パーティショニングはテーブル継承で行われるため、最初に行うことは新しい子テーブルを設定することです。

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

    次に、ルールまたはトリガーのいずれかを使用して、データを正しいテーブルにドロップする必要があります。ルールは、一括更新でより高速になり、単一更新でトリガーがより高速になり、保守も容易になります。これがトリガーのサンプルです。

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

    挿入を行うためのトリガー機能

    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;
    

    これらの例は、読みやすくするためのpostgresqlドキュメントの簡略版です。

    私はpgpool2に精通していませんが、gridsqlは、postgresqlの上に構築された商用データベースであるEnterpriseDB用に設計された商用製品です。彼らの製品は非常に優れていますが、標準的なpostgreslでは機能しないと思います。




    1. DevOpsがDBaaS(Database-as-a-Service)を使用してアプリケーション開発を最適化する方法

    2. サブクエリにないSQLselectは結果を返しません

    3. AWSサミット2018:シカゴのまとめ

    4. MSDBのメンテナンスの重要性