範囲、リスト、ハッシュパーティショニング
時系列には範囲、テナントにはリスト、均等な分散にはハッシュというように、適切なパーティショニング戦略を選びます。
「範囲、リスト、ハッシュパーティショニング」はCoddyKit上の無料SQL Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはSQL Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 SQL Academyコースには全4レッスンが含まれています。
範囲パーティショニング
各パーティションは値の連続した範囲を担当します。時系列データで最もよく使われます。
CREATE TABLE events (
id BIGSERIAL,
ts TIMESTAMPTZ NOT NULL,
data JSONB
) PARTITION BY RANGE (ts);
CREATE TABLE events_2024_q1 PARTITION OF events
FOR VALUES FROM ('2024-01-01') TO ('2024-04-01');
CREATE TABLE events_2024_q2 PARTITION OF events
FOR VALUES FROM ('2024-04-01') TO ('2024-07-01');範囲の境界は半開区間
FROMは含み、TOは含みません。境界がきれいに揃うため、重複も隙間もありません。
リストパーティショニング
各パーティションは特定の値を格納します。
CREATE TABLE customers (
id BIGSERIAL,
country TEXT NOT NULL,
name TEXT
) PARTITION BY LIST (country);
CREATE TABLE customers_us PARTITION OF customers FOR VALUES IN ('US');
CREATE TABLE customers_eu PARTITION OF customers FOR VALUES IN ('DE','FR','IT','ES','NL');
CREATE TABLE customers_other PARTITION OF customers DEFAULT;DEFAULT パーティション
他のパーティションに一致しない行を受け入れます。これがない場合、一致するパーティションがない行のINSERTは失敗します。
ハッシュパーティショニング
行をパーティションキーのハッシュ値に基づいて分散します。均等に分散したいものの、自然な範囲やリストがない場合に適しています。
CREATE TABLE sessions (
id UUID,
user_id BIGINT,
data JSONB
) PARTITION BY HASH (user_id);
CREATE TABLE sessions_0 PARTITION OF sessions FOR VALUES WITH (MODULUS 4, REMAINDER 0);
CREATE TABLE sessions_1 PARTITION OF sessions FOR VALUES WITH (MODULUS 4, REMAINDER 1);
CREATE TABLE sessions_2 PARTITION OF sessions FOR VALUES WITH (MODULUS 4, REMAINDER 2);
CREATE TABLE sessions_3 PARTITION OF sessions FOR VALUES WITH (MODULUS 4, REMAINDER 3);戦略の選択
- Range — 時系列データ、単調増加するID
- List — テナント、国、ホットティア
- Hash — 自然な偏りがなく、並列性だけが必要な場合
サブパーティショニング
パーティション自体をさらにパーティション分割できます(多段階)。
CREATE TABLE events_2024 PARTITION OF events
FOR VALUES FROM ('2024-01-01') TO ('2025-01-01')
PARTITION BY HASH (user_id);
-- 2024 is a yearly range partition, internally hashed by user_id.パーティション分割されたテーブルのインデックス
親テーブルのインデックスは、すべてのパーティションに自動的に反映されます。UNIQUE制約にはパーティションキーを含める必要があります。
CREATE INDEX events_user_idx ON events (user_id);
-- Creates one index per partition automatically.
ALTER TABLE events ADD CONSTRAINT events_uniq UNIQUE (id, ts);
-- ts must be in the constraint because it's the partition key.主キーとパーティション
パーティション分割されたテーブルのPRIMARY KEYには、パーティション列を含める必要があります。これは宣言的パーティショニングの基本的な制約です。
パーティションの追加と削除
コストの低い操作です。
CREATE TABLE events_2024_q3 PARTITION OF events
FOR VALUES FROM ('2024-07-01') TO ('2024-10-01');
DROP TABLE events_2023_q1;
-- Instant; equivalent to deleting all old data.パーティションの自動作成
Postgresは将来のパーティションを自動作成しません。一般的な解決策は次のとおりです。
- pg_partman拡張機能 — 月次パーティションを管理します
- 次のパーティションをCREATEするスケジュールジョブ
外部キー
パーティション分割されたテーブルへのFKにはPG 12以降が必要です。パーティション分割されたテーブルから通常のテーブルへのFKは、通常どおり機能します。
まとめ
3種類のパーティショニング戦略で、ほとんどのケースに対応できます。
- 時間や連番にはRange
- 離散的な集合にはList
- 均等な分散にはHash
- PKにはパーティション列を含める必要がある
クイックチェック
user_id で sessions テーブルをパーティション分割し、均等に分散させたいとします。自然な順序はありません。どの戦略を選びますか?
よくある質問
「範囲、リスト、ハッシュパーティショニング」レッスンは無料ですか?
はい。「範囲、リスト、ハッシュパーティショニング」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、SQL Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 SQL Academyコースには全4レッスンが含まれています。
「範囲、リスト、ハッシュパーティショニング」で何を学びますか?
時系列には範囲、テナントにはリスト、均等な分散にはハッシュというように、適切なパーティショニング戦略を選びます。 ブラウザで直接実行するハンズオンコードでSQL Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
SQL Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのSQL Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。
「範囲、リスト、ハッシュパーティショニング」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このSQL Academyレッスンでコードを書いて実行できますか?
はい。すべてのSQL Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- パーティショニングの理由:プルーニングとメンテナンス
- 範囲、リスト、ハッシュパーティショニング
- パーティションの切り離しと接続
- パーティション横断クエリの効率化