DynamoDB でアイテム数を数えるには?
Query か Scan で Select: 'COUNT' を使うと、一致したアイテムを返さずに数えられます。1 回のレスポンスがカウントするのはスキャンした 1 MB 分までなので、総数を得るには LastEvaluatedKey でページ送りしながら Count の値を合計しなければなりません。テーブル全体のおおよその件数なら、DescribeTable の ItemCount を読みます。グループ化した件数や、列に対する SUM/AVG が欲しいなら、DynoTableの SQL Workbench が COUNT と GROUP BY を 1 つのクエリとして実行し、ページ送りも代わりにこなします。
一致したアイテムを正確に数える
Query(1 つのパーティションキーに対して)か Scan(テーブル全体)で Select を COUNT に設定します。レスポンスは Count と ScannedCount を返し、アイテムのデータは返しません。スキャンしたデータが 1 MB を超えると操作は停止して LastEvaluatedKey を返すので、それがなくなるまで呼び出しと Count の加算を続けます。数えることは読むことより安くはない点に注意してください。COUNT はアイテムを返すのと同じ読み取りキャパシティを消費します。
Count と ScannedCount
Count— このページで、キー条件やフィルタ条件に一致したアイテム数。ScannedCount— フィルタ前に検査されたアイテム数。フィルタ式は結果を絞りますが、スキャンされた量(とそのコスト)は減らしません。
COUNT は割引ではない、実測
「数えるコストは読むコストと同じ」は主張しやすく、疑われやすい命題です。ですから、およそ 3 KB のアイテムを 40 件(合計 120,700 バイト)保持するテーブルでの結果を示します。各呼び出しには ReturnConsumedCapacity: 'TOTAL' を付けています。
| リクエスト | Count | ScannedCount | ConsumedCapacity |
|---|---|---|---|
Select: 'COUNT' 付きの Query | 40 | 40 | 15 |
アイテムを返す Query | 40 | 40 | 15 |
Scan、Select: 'COUNT'、半分に一致するフィルタ | 20 | 40 | 15 |
見るべきは 3 行目です。フィルタは Count を半分にし、ScannedCount はそのままにし、請求はまったく動かしません。
15 は予測できる数字です。120,700 バイトは 4 キロバイトの読み取りユニット 30 個に切り上がり、Query は明示しない限り結果整合性なので半分になります。
安上がりな近似
DescribeTable は ItemCount を返します。これはテーブル全体の推定値で、おおむね 6 時間ごとに更新されます。無料で即座に得られますが、リアルタイムではありません。ダッシュボードには向きますが、正確な総数には向きません。
DynamoDB Local でテストする場合の注意が 1 つ。あちらは ItemCount を即座に更新します。40 件を書き込んで DescribeTable を呼ぶと、すぐに 40 が返ってきます。実サービスはそうしないので、ローカルで通る鮮度のロジックが、本番では 6 時間ずれることがあります。
DynoTable で数え、集計する
生の API は COUNT を提供しますが、GROUP BY も SUM も AVG もありません。グループ化と合計は通常アプリケーションのコードで行われます。DynoTableの SQL Workbench はそれらを追加します。SELECT COUNT(*)、SUM(total)、あるいはグループ化した件数を書けば、ページ送りのループを代わりに回し、ページが流れ込むにつれて数値を精緻化します。読み取りは依然として DynamoDB を通るので同じ読み取りキャパシティのコストがかかりますが、ループの代わりに 1 つのクエリを書けばよく、API が直接返せないグループ化・合計済みの結果が得られます。
さらに詳しく
DynamoDB での COUNT、SUM、集計を読み、式ビルダーでカウントのクエリを組み立てましょう。自分のテーブルに対してカウントや集計(COUNT、SUM、GROUP BY)を実行するには、DynoTable をダウンロードしてください。
参考資料
- Query — Amazon DynamoDB API Reference
- Scan — Amazon DynamoDB API Reference
- TableDescription — Amazon DynamoDB API Reference
最終検証日 2026-07-13、上記にリンクした公式 AWS ドキュメントに照らして確認しました。
キャパシティの数値は 2026-07-28 に、@aws-sdk/client-dynamodb 3.1095.0 を用いて DynamoDB Local 3.3.0(amazon/dynamodb-local:latest)に対して再現しました。DynamoDB Local は実サービスではありません。上で触れた ItemCount の相違は、両者が異なる 1 点です。