初級読了 1 分

DynamoDBテーブルのサイズとアイテム数を取得する方法

DynamoDBテーブルに気軽に向けられるSELECT COUNT(*)はありません。DynamoDBは「このテーブルはどれくらいの大きさか?」に対して、まったく性質の異なる2つの答えを返します:最大6時間古い可能性のある無料の推定値と、テーブル全体の読み取りコストがかかる正確なカウントです。「なぜアイテム数が間違っているのか?」という混乱のほとんどは、一方を選びながらもう一方の挙動を期待していることが原因です。

DynamoDBテーブルのアイテム数とサイズを取得するには?

DescribeTableを呼び出します:ItemCountTableSizeBytesを無料で返しますが、「DynamoDBはこの値をおよそ6時間ごとに更新します。最近の変更はこの値に反映されていない可能性があります」 (AWS APIリファレンス)。 正確な数が必要なら、--select COUNT付きのScanを実行します — カウントだけを返しますが、すべてのアイテムを読み取り(そして課金し)ます。DynoTableのようなGUIはすべてのテーブルで推定値を表示し、必要に応じて正確なカウントを計算できます。

やりたいこと使うものコスト鮮度
ざっくりしたカウント+サイズ、無料DescribeTableなし(メタデータ呼び出し)約6時間の遅延
正確な総アイテム数Select COUNT付きのScanテーブル全体を読み取りライブ
1つのキーに対する正確なカウントSelect COUNT付きのQuery一致するアイテムを読み取りライブ
フィルタしたサブセットのカウントScan/Query + フィルタ + COUNT_スキャンした_すべてを読み取りライブ

方法1:DescribeTable(無料、約6時間の遅延)

DescribeTableはメタデータの参照です — アイテムを一切読み取らないので読み取りキャパシティを消費せず、探している2つの数値を返します:

aws dynamodb describe-table --table-name Orders \
  --query 'Table.[ItemCount, TableSizeBytes]'

どちらにも同じ但し書きが付きます。 APIリファレンス そのままの表現で:「DynamoDBはこの値をおよそ6時間ごとに更新します。最近の変更はこの値に反映されていない可能性があります。」つまり一括ロードしたばかりのテーブルが何時間もItemCount: 0と報告することがあります — 数値が間違っているのではなく、スナップショットなのです。

同じレスポンスにはインデックスごとの数値も含まれます:すべてのGSIとLSIが、同じ6時間サイクルで自身のItemCountIndexSizeBytesを報告します。のアイテム数をテーブルのアイテム数と比較するのは、無料でできる良いヘルスチェックです — 実際にインデックスキーを持つアイテムがいくつあるかが分かります。

方法2:Scan + Select COUNTによる正確なカウント

「今朝時点の、おおよその値」では足りないときは、実際に数えます:

aws dynamodb scan --table-name Orders --select COUNT

実行する前に知っておくべき事実を、すべて Scan APIリファレンス から:

  • COUNTは「一致するアイテムそのものではなく、一致するアイテムの数を返します」— ネットワークトラフィックは減ります。しかし「これはアイテムを取得するのと同じ量の読み取りキャパシティユニットを使用します」。100 GBのテーブルの正確なカウントは、請求書上は100 GBの読み取りです。
  • 単一のリクエストはそれでもスキャンしたデータ1 MBで止まります。レスポンスのCountは「単一のスキャンリクエストに限定されたアイテム数のみを返します」。CLIはLastEvaluatedKeyを辿ってページを合計してくれます。SDKのコードでは自分でループして加算します — ページネーションを参照してください。
  • 大きなテーブルでは、並列スキャン(--segment / --total-segments)で作業を分割し、セグメントごとのカウントを合計してください。

サブセットをカウントする

  • 1つのパーティションキー配下のアイテム: --select COUNT付きのQuery — そのキーのアイテムだけを読み取るので、データが小さければそれだけ安価です。を数える正しい方法です。
  • フィルタに一致するアイテム: FilterExpressionを追加します — ただし課金されるのはCountではなくScannedCountであることを忘れないでください:DynamoDBは読み取った_後_にフィルタするので、フィルタ付きスキャンで「アーカイブ済みの注文を数える」と、すべての注文の分を支払います。小さなCountの隣に大きなScannedCountがあるのは、GSIになりたがっているフィルタの兆候です — フィルタリング戦略を参照してください。

より高度な質問 — ステータスごとのカウント、合計、平均 — に対しては、DynamoDBにはGROUP BYが一切ありません。回避策はカウント・合計・集計にあります。

DynoTableでのテーブルサイズとアイテム数

DynoTableは、両方の答えをあなたがすでに見ている場所に置きます。開いているすべてのテーブルには、タブのツールバーにStatsボタン(棒グラフのアイコン)があり、パネルには次が表示されます:

  • プライマリキーとセカンダリインデックス — テーブルの形が一目で分かります。
  • Items · Size · Avg item — DynamoDB自身のDescribeTable推定値。推定値であることが明示され、6時間の但し書きはホバー1つで確認できます。
  • Index table — ワンクリックのサンプリングスキャンで、アイテムが実際に持つすべての属性(commonData.statusのようなネストされたパスを含む)をライブの進捗表示付きで発見します。フィールドのオートコンプリートと、推論によるTypeScript / Zod / JSON Schemaエクスポートを支えており、通常のDynamoDB読み取りコストがかかります — アプリは事前にそのことを明示します。
DynoTableのTable statsパネル:キーとインデックス、Items / Size / Avg itemの推定値の行、そしてインデックス済みフィールドのリスト。
DynoTableのTable statsパネル:キーとインデックス、Items / Size / Avg itemの推定値の行、そしてインデックス済みフィールドのリスト。

そして正確な数値については、組み込みのAIアシスタントが、リクエストに応じてテーブル全体に対するカウント、合計、グループごとの内訳を計算します — 1ページをサンプリングするのではなく、一致するすべてのアイテムを読み取り、読み取りキャパシティのかかる操作を実行する前には必ず確認を求めます。

FAQ

DynamoDBのアイテム数が間違っているのはなぜですか? 間違っているのではなく、古いのです。ItemCount(とTableSizeBytes)は「およそ6時間ごと」に更新されるため、最近の書き込みと削除はまだ反映されていません。コンソールのテーブル概要も同じDescribeTableの数値を、同じ遅延付きで表示しています。

DynamoDBの行数を正確に数えるには? aws dynamodb scan --table-name X --select COUNTです — CLIがテーブル全体をページングし、ページごとのカウントを合計します。正確ですが、すべてのアイテムを取得するのと同じ読み取りキャパシティが課金されます。

DescribeTableは無料ですか? 読み取りキャパシティを消費しません — データの読み取りではなくメタデータ呼び出しなので、ポーリングしてもテーブルのスループットには触れません。

1つのアイテムのサイズを知るには? DynamoDBはアイテムサイズで計測します(書き込みは1 KB単位、読み取りは4 KB単位で切り上げ)。アイテムをアイテムサイズ計算ツールに貼り付ければ課金サイズが分かります。上限については400 KBのアイテムサイズ制限を参照してください。

アイテム数は請求額に影響しますか? ストレージはTableSizeBytesで、リクエストはアイテムサイズ×リクエスト数で課金されます — アイテム数が直接課金されるわけではありません。テーブルの数値を料金計算ツールに入力すれば、オンデマンドとプロビジョンドの両モードでの月額の全体像が見えます。

テーブルの形、推定値、インデックス済みフィールドをワンクリックで確認したいですか?DynoTableをダウンロードして、任意のテーブルでStatsパネルを開いてください。

更新日