1. ホーム
  2. データベース
  3. ポストグレスキュー

PostgreSQLのテーブルをパーティション分割する3つの方法

2022-01-10 22:11:18

I. はじめに

テーブル・パーティショニングは、例えば、大きすぎる1つのテーブルによって引き起されるパフォーマンス問題のいくつかを解決する方法です。大きすぎるテーブルは、クエリの速度を低下させる原因となり、解決策としてパーティショニングを行うことがあります。一般的に、1つのテーブルのサイズがメモリを超える場合、テーブルパーティショニングを検討することをお勧めします。PostgreSQLでは、テーブルをパーティショニングする3つの方法があります。

  • レンジ:レンジパーティショニング。
  • リスト:リストパーティション。
  • Hash: ハッシュパーティション。

この記事では、3種類のパーティショニングの方法を、例を挙げて説明します。

II. 3つの方法

便宜上、DockerでPostgreSQLを起動しますが、以下のコマンドで、Hashパーティションがサポートされないため、上位バージョンを選択する必要があります。

<ブロッククオート

docker run -itd \

    --name pkslow-postgres \ \?

    -e POSTGRES_DB=pkslow ୧⃛(๑⃙⃘◡̈๑⃙⃘)

    -e POSTGRES_USER=pkslow ୧⃛(๑⃙⃘◡̈๑⃙⃘)

    -e POSTGRES_PASSWORD=pkslow ୧⃛(๑⃙⃘◡̈︎๑⃙⃘)

    -p 5432:5432 \

    ポストグレス:13

2.1. レンジ範囲分割

まず年齢を表すテーブルを作成し、次に年齢区分に基づいてパーティションを設定し、以下のようにテーブル文を作成します。

CREATE TABLE pkslow_person_r (
    age int not null,
    city varchar not null
) PARTITION BY RANGE (age);

このステートメントでは、すでに年齢フィールドによるパーティショニングを指定し、パーティションテーブルを作成しています。

create table pkslow_person_r1 partition of pkslow_person_r for values from (MINVALUE) to (10);
create table pkslow_person_r2 partition of pkslow_person_r for values from (11) to (20);
create table pkslow_person_r3 partition of pkslow_person_r for values from (21) to (30);
create table pkslow_person_r4 partition of pkslow_person_r for values from (31) to (MAXVALUE);

ここでは、0歳から10歳、11歳から20歳、21歳から30歳、30歳以上に対応した4つのパーティションテーブルが作成されている。

次に、いくつかのデータを挿入します。

insert into pkslow_person_r(age, city) VALUES (1, 'GZ');
insert into pkslow_person_r(age, city) VALUES (2, 'SZ');
insert into pkslow_person_r(age, city) VALUES (21, 'SZ');
insert into pkslow_person_r(age, city) VALUES (13, 'BJ');
insert into pkslow_person_r(age, city) VALUES (43, 'SH');
insert into pkslow_person_r(age, city) VALUES (28, 'HK');

ここでもテーブル名が pkslow_person_r これは、特定のパーティションテーブルではなく、クライアント非対応であることを示しています。

にも問い合わせる。

しかし、実際に存在するパーティションドテーブルは、以下の通りです。

そして、パーティションされたテーブルのフィールドは、メイン・テーブルのフィールドと同じです。

パーティション分割されたテーブルに問い合わせると、その特定のパーティションのデータのみが表示されます。

2.2. リスト・パーティション

同様に、リスト・パーティショニングは、特定の値によるパーティショニングで、あるパーティションの特定の都市のデータを比較します。ここでは各ステップの説明は省きますが、コードは以下のようになります。

-- Create the main table
create table pkslow_person_l (
                          age int not null,
                          city varchar not null
) partition by list (city);

-- create partitioned table
CREATE TABLE pkslow_person_l1 PARTITION OF pkslow_person_l FOR VALUES IN ('GZ');
CREATE TABLE pkslow_person_l2 PARTITION OF pkslow_person_l FOR VALUES IN ('BJ');
CREATE TABLE pkslow_person_l3 PARTITION OF pkslow_person_l DEFAULT;

-- Insert test data
insert into pkslow_person_l(age, city) VALUES (1, 'GZ');
insert into pkslow_person_l(age, city) VALUES (2, 'SZ');
insert into pkslow_person_l(age, city) VALUES (21, 'SZ');
insert into pkslow_person_l(age, city) VALUES (13, 'BJ');
insert into pkslow_person_l(age, city) VALUES (43, 'SH');
insert into pkslow_person_l(age, city) VALUES (28, 'HK');
insert into pkslow_person_l(age, city) VALUES (28, 'GZ');

最初のパーティションに問い合わせたところ、広州のデータしかありませんでした。

2.3. ハッシュハッシュパーティショニング

ハッシュパーティショニングとは、フィールドごとにハッシュ値を取り、それをパーティショニングすることである。具体的には以下のような記述になります。

-- Create the main table
create table pkslow_person_h (
                          age int not null,
                          city varchar not null
) partition by hash (city);

-- Create a partitioned table
create table pkslow_person_h1 partition of pkslow_person_h for values with (modulus 4, remainder 0);
create table pkslow_person_h2 partition of pkslow_person_h for values with (modulus 4, remainder 1);
create table pkslow_person_h3 partition of pkslow_person_h for values with (modulus 4, remainder 2);
create table pkslow_person_h4 partition of pkslow_person_h for values with (modulus 4, remainder 3);

-- insert into test data
insert into pkslow_person_h(age, city) VALUES (1, 'GZ');
insert into pkslow_person_h(age, city) VALUES (2, 'SZ');
insert into pkslow_person_h(age, city) VALUES (21, 'SZ');
insert into pkslow_person_h(age, city) VALUES (13, 'BJ');
insert into pkslow_person_h(age, city) VALUES (43, 'SH');
insert into pkslow_person_h(age, city) VALUES (28, 'HK');

パーティションド・テーブルを作るときにモジュロを使ったので、もしN個のパーティションド・テーブルを作りたいなら、N個のモジュロを取らなければならないことがわかりますね。

パーティションドテーブルのランダムクエリは、次のようになります。

同じSZのハッシュは同じで間違いなく同じパーティションになり、BJのハッシュもモジュロ後に同じパーティションになることがわかります。

III. まとめ

この記事では、PostgreSQLをパーティション分割する3つの方法について説明します。

コードは、こちらをご覧ください。 https://github.com/LarryDpk/pkslow-samples

以上、PostgreSQLのテーブル・パーティショニングの3つの方法について詳しく説明しましたが、PostgreSQLのテーブル・パーティショニングに関するより詳しい情報は、Script Houseの他の関連記事にも注目してください