ちばのてっく

積極的にアウトプット

DynamoDBのレスポンスに含まれるCountとScannedCountの違いを調べてみた

先日の記事を書きながら、DynamoDBにScanした際のレスポンスにCountとScannedCountという似たような名前で同じ値を返却しているものがあることが気になっていたため、調べてみた。

Scanレスポンス

先日の記事からコピペ。"Count": 2,"ScannedCount": 2と返却されていた。

{
  "Count": 2,
  "Items": [
    {
      "color": {
        "S": "yellow"
      },
      "target": {
        "S": "banana"
      }
    },
    {
      "color": {
        "S": "red"
      },
      "target": {
        "S": "apple"
      }
    }
  ],
  "ResponseMetadata": {
    "HTTPHeaders": {
      "connection": "keep-alive",
      "content-length": "132",
      "content-type": "application/x-amz-json-1.0",
      "date": "Wed, 13 Mar 2024 22:29:09 GMT",
      "server": "Server",
      "x-amz-crc32": "2357452850",
      "x-amzn-requestid": "9E048FPDU66OTKVD4QQP98LSBRVV4KQNSO5AEMVJF66Q9ASUAAJG"
    },
    "HTTPStatusCode": 200,
    "RequestId": "9E048FPDU66OTKVD4QQP98LSBRVV4KQNSO5AEMVJF66Q9ASUAAJG",
    "RetryAttempts": 0
  },
  "ScannedCount": 2
}

結論

以下の違いがある。

  • Count:フィルター適用前の項目数
  • ScannedCount:フィルター適用後の項目数

フィルターを利用していない場合は、CountとScannedCountの値は同一になる。そのため、先日の記事ではCountとScannedCountが同じ値になっていた。

なお、DynamoDBが一度に返却するItemは上限1MBまであり、それ以上のItemを返却するためにはリクエストを分割する必要がある。CountおよびScannedCountの値は分割した単一リクエストごとの値となり、リクエスト全体の合計値ではないことに注意が必要。なので、リクエスト全体の合計値を取得したい場合はアプリケーション側で集計する処理を行う必要がある。

参考

結果での項目のカウント
https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/Query.Other.html#Query.Count