シャード間クエリ:難しい問題
分散データベースでシャード間の結合とトランザクションが最も難しい問題になる理由と、それらを最小限に抑えるパターンを理解します。
「シャード間クエリ:難しい問題」は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フィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- シャーディング戦略:範囲、ハッシュ、ディレクトリ
- シャード間クエリ:難しい問題
- Citusと分散Postgres
- シャーディングしない場合