0Pricing
SQL Academy · レッスン

範囲、リスト、ハッシュパーティショニング

時系列には範囲、テナントにはリスト、均等な分散にはハッシュというように、適切なパーティショニング戦略を選びます。

「範囲、リスト、ハッシュパーティショニング」は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フィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. パーティショニングの理由:プルーニングとメンテナンス
  2. 範囲、リスト、ハッシュパーティショニング
  3. パーティションの切り離しと接続
  4. パーティション横断クエリの効率化
← SQL Academyに戻る