DynamoDBのGetやPutなどの通常操作であれば1レコード1ユニット単位での計算となるが、
QueryやScanの場合はどうなってたっけ?という疑問が湧いてきたので調べてみた。
前提:ユニットという単位について
DynamoDBでは ユニット
という単位でスループットを計算する。
ドキュメントによると以下のような仕様になる。
キャパシティーユニットの用途 | 計算方法 |
---|---|
読み込み | 1 秒あたりの項目読み込み数 × 4 KB の項目サイズ(結果整合性のある読み込みを使用する場合は、1 秒あたりの読み込み数が倍になります) |
書き込み | 1 秒あたりの項目書き込み数 × 1 KB の項目サイズ |
例えば
- 1レコードが 3.5KB であれば 読み込みユニット数は 1レコード=1ユニット
- 1レコードが 3.5KB であれば 書き込みユニット数は 1レコード=4ユニット
という計算になる。
上記の例であれば、秒間100読み込みを保証したいのであれば100キャパシティを、
秒間100書き込みを保証したいのであれば400キャパシティを予約しておけば良い。
Query および Scan の消費読み込みキャパシティについて
結論から言うと、通常のGetと計算方法が 異なる 。
例えば以下のレコードを抽出しようとした時には以下の計算方法になる。
シナリオ
項目 | 値 |
---|---|
秒間あたりの取得レコード数 | 100 |
1レコード辺りのサイズ | 512byte |
操作毎の計算方法
操作 | 必要とする秒間あたりのスループット |
---|---|
Get or BatchGetItem | 1ユニット x 100 = 100キャパシティ |
Query or Scan | (512 x 100) / 4KB = 12.5キャパシティ |
通常の操作では 「レコードベースの計算」に、
QueryおよびScanでは「サイズベースの計算」となる。