DynamoDB を使うべきでないのはどんなときですか?
ワークロードが分析系であるか、アクセスパターンが未知のときは DynamoDB を避けてください。DynamoDB は、既知のキーベースのアクセスパターンを持つ運用系(OLTP)ワークロードのために作られています。結合も集計関数もなく、アドホックなクエリはコストの高いテーブル全件スキャンに落ちます。OLAP のレポーティングや、進化していくリレーショナルな要件には、別のエンジンを選んでください。
相性の悪い用途
- アドホックな分析とレポーティング(OLAP)—
GROUP BY、SUM、AVGはありません。すべてのロールアップはスキャンか、自分で維持する事前計算済みの集計です。回避策は集計ガイドを参照してください。 - 正規化されたリレーショナルスキーマ — DynamoDB は意図的に JOIN 演算子を省いており、AWS 自身の指針は非正規化することです。モデルが読み取り時に本当に多方向の結合を必要とするなら、リレーショナルエンジンのほうが合います。
- 未知の、あるいは急速に変わるアクセスパターン — キーはクエリを中心に設計します。クエリをまだ名指しできないなら、新しいクエリのたびにテーブルの再設計かフルスキャンのリスクを負います。
- 全文検索とリッチなクエリ — DynamoDB は全文検索に対応しているか?を参照してください。検索は検索インデックスの仕事です。
- 大きなオブジェクト — アイテムは 400 KB で頭打ちです。メディアやドキュメントは S3 に置き、テーブルにはポインターを持たせます。
拒否され、そして値段を付けられるロールアップ
分析との相性の悪さは好みの問題ではありません。PartiQL でグループ化した件数を求めると、文は何かを読む前に拒否されます。
SELECT status, COUNT(*) FROM "orders" GROUP BY statusValidationException: Unsupported clause: GROUP BY
HTTP 400グループ化を外して単純な合計を求めると、もう 1 段階手前のパーサーで失敗します。
SELECT COUNT(*) FROM "orders"ValidationException: Unexpected path component at 1:8:5
HTTP 400この方言に COUNT という関数はそもそもないので、パーサーはそれを属性パスとして読み、括弧のところで諦めます。
そうすると残るのは自分で書く Scan で、これには値段が付きます。50 GB のテーブルを端から端まで読むと 6,553,600 の結果整合性の読み取りユニットがかかります。これはスキャンした合計サイズを 4 KB 単位にしたものを半分にした値です。us-east-1 のオンデマンドでは $0.82 です。
その 1 つの数字を毎時更新すると、月 $598 になります。書き込みのたびにカウンターを維持するか、分析用ストアにエクスポートするほうが安い答えであり、そのどちらも DynamoDB があなたの代わりにやってくれない仕事です。
真価を発揮する場面
その裏返しのリストが、そのまま DynamoDB の得意分野です。予測可能なキーベースの読み書きを持ち、どんな規模でも 1 桁ミリ秒を保たなければならない大量の運用系ワークロード — カート、セッション、プロフィール、ゲームの状態、IoT イベントなどです。DynamoDB を使うべき場面のガイドが、その肯定側を扱っています。
さらに詳しく
迷っているなら、次は DynamoDB を使うべきときを読んでください。すでに DynamoDB を使っていて SQL が恋しいなら、DynoTable がライブのテーブルに対して JOIN と GROUP BY をデスクトップから実行します。そして料金計算ツールは、決める前にそのワークロードがいくらになるかを教えてくれます。
参考資料
- What is Amazon DynamoDB? — Amazon DynamoDB Developer Guide
- Constraints in Amazon DynamoDB — Amazon DynamoDB Developer Guide
- Query — Amazon DynamoDB API Reference
最終検証日 2026-07-13、上記にリンクした公式 AWS ドキュメントに照らして確認しました。400 KB の数字は 2026-07-28 に再確認しています。AWS はこれをサービスクォータのページから Constraints.html に移しました。
2026-07-28 に、Node v24.18.0 上の @aws-sdk/client-dynamodb 3.1095.0 経由で DynamoDB Local 3.3.0 に対して再現しました。2 つの ValidationException メッセージはどちらも逐語です。Scan のコストは同期済みの AWS 料金テーブルにある us-east-1 の料率から算出しています。