0Pricing
SQL Academy · レッスン

シャード間クエリ:難しい問題

分散データベースでシャード間の結合とトランザクションが最も難しい問題になる理由と、それらを最小限に抑えるパターンを理解します。

「シャード間クエリ:難しい問題」はCoddyKit上の無料SQL Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはSQL Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 SQL Academyコースには全4レッスンが含まれています。

シャーディングの代償

シャーディングによって書き込みと容量をスケールできますが、複数のシャードにまたがるクエリは扱いにくくなります。シャード横断クエリはすべてファンアウトになるためです。

単一シャードクエリは簡単

WHERE句にシャードキーが含まれていれば、ルーターは1つのシャードに1つのクエリを送信します:

-- shard_id = hash(user_id) % N
SELECT * FROM orders WHERE user_id = 42;
-- Router computes shard, sends one query, gets one result.

ファンアウトクエリ

シャードキーがない場合、ルーターはすべてのシャードにクエリを送り、結果をマージします:

-- WHERE status = 'paid' — no user_id
SELECT * FROM orders WHERE status = 'paid' ORDER BY created_at DESC LIMIT 100;
-- Must query all N shards, merge results, sort, take top 100.

ファンアウト集約

COUNT/SUM/AVGの場合は、各シャードから部分的な結果を取得し、ルーターまたはアプリケーションで結合します:

-- On each shard:
SELECT COUNT(*), SUM(total) FROM orders;

-- Aggregator:
final_count = SUM(counts), final_sum = SUM(sums)

-- AVG is trickier — need SUM and COUNT, can't average averages.

シャード横断JOIN

両方のテーブルが同じキーでシャード分割されている場合(コロケーション)、JOINはシャード内で完結します。それ以外の場合、規模が大きくなると実質的に不可能です。

リファレンステーブル(全シャードにレプリケーション)

小さな「ルックアップ」テーブルをすべてのシャードにレプリケーションすると、それらとのJOINをシャード内で完結できます。Citusではこれを「リファレンステーブル」と呼びます。

シャード横断パターンの回避

スキーマ設計の工夫:

  • 非正規化する — 親のデータを子と同じシャードに複製します
  • 「不要」に見える場合でも、どこでもシャードキーを使用します
  • レポートを別の分析用DBで事前計算します

シャードをまたぐページネーション

複数のシャードに対してOFFSET 1000 LIMIT 10を実行するのは最悪です。すべてのシャードで1010行を生成する必要があります。代わりにキ​​ーセットページネーションを使用します。

分散トランザクション

2フェーズコミット(2PC)は、シャード間のアトミックなコミットを調整します。パーティション分断時には遅く、脆弱です。実際には、「Saga」パターンを前提に設計します:

// Saga pattern (conceptual):
//   1. Local TX on shard A: mark as pending, log
//   2. RPC to shard B: do its part
//   3. Local TX on shard A: mark as committed
//   4. On failure: compensating transactions

ホットシャード

著名なユーザーや急速に広まった商品によって、1つのシャードにトラフィックが集中すると、スケーリングの効果が失われます。検出して分割(サブシャーディング)するか、移動します。

シャード横断の外部キー

RDBMSの外部キー(FK)はシャードをまたげません。アプリケーションで参照整合性を保証するか、シャード横断のリレーションについては結果整合性を受け入れます。

まとめ

シャーディングでは、「書き込みをスケールする」ことから「シャード内で完結するようにクエリを構成する」ことへ、難しさが移ります。

  • 単一シャードクエリは高速
  • ファンアウトは低速
  • 処理をローカルに保つために非正規化
  • 共有ディメンションにはリファレンステーブル
  • 2PCの代わりにSaga

確認問題

シャード化されたデータベースで、WHERE句にシャードキーを指定しないSELECTはなぜ高コストになるのでしょうか。

よくある質問

「シャード間クエリ:難しい問題」レッスンは無料ですか?

はい。「シャード間クエリ:難しい問題」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと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. Citusと分散Postgres
  4. シャーディングしない場合
← SQL Academyに戻る