使用 AWS CLI 的 DynamoDB Scan
aws dynamodb scan 會自動分頁,這很方便,同時也表示你用來判斷損害程度的那個數字,預設就是錯的。什麼時候該完全避開這個操作,請見 Query 與 Scan 的比較。
程式碼
aws dynamodb scan \
--table-name 'Music' \
--filter-expression '#filter0 >= :filterValue0' \
--expression-attribute-names '{"#filter0":"Year"}' \
--expression-attribute-values '{":filterValue0":{"N":"2010"}}'--return-consumed-capacity 回報的是一頁,不是整次掃描
測試資料是 600 首各約 3.9 KB 的歌曲,其中 8 首符合條件。在那個指令加上 --return-consumed-capacity TOTAL,CLI 印出:
{ "Count": 8, "ScannedCount": 600, "CU": 128.5 }這次掃描實際上跨三頁花了 284.5 個讀取單位。Count 與 ScannedCount 是三頁加總的;ConsumedCapacity 則只取了第一頁,其餘直接丟掉。與其說這是 bug,不如說是一條明訂的規則 — botocore 的 DynamoDB 分頁器設定把 Count 與 ScannedCount 列為結果鍵,把 ConsumedCapacity 列為非彙總鍵。
破綻在於:工作量沒變,那個數字卻會變。同一張資料表、同樣讀了 600 筆項目,只多加一個旗標:
--page-size 50 -> { "Count": 8, "ScannedCount": 600, "CU": 24.0 }如果你要用一次 CLI 掃描來估算資料表容量,請用 --page-size 搭配 --starting-token 自己把每頁加總,或是從 CloudWatch 讀取容量。
--max-items 不會讓掃描停下來
--max-items 3 讀起來像是一次便宜的抽樣。它不是:
--max-items 3 -> { "Count": 8, "ScannedCount": 600 }CLI 會一直要下一頁,直到湊夠符合條件的項目為止 — 而在一個選擇性很高的過濾條件下,那意味著整張資料表 — 然後才把印出來的清單截短。它自己的續傳 token 大聲地說明了這件事:
{"ExclusiveStartKey": {"Artist": {"S": "Arturo Sandoval"},
"SongTitle": {"S": "Cubano Chant 0541"}}, "boto_truncate_amount": 3}boto_truncate_amount 是一個用戶端的計數器。要限制 DynamoDB 實際讀多少,請用 --page-size,它會替每一次底層請求設定 API 的 Limit,再用 --starting-token 續傳:
aws dynamodb scan \
--table-name 'Music' \
--page-size 500 \
--max-items 100 \
--starting-token "$NEXT_TOKEN"已於 2026-07-28 以 aws-cli/2.36.9 對照 DynamoDB Local(amazon/dynamodb-local)實測。上方的 JSON 是 CLI 自己的輸出,只用 --query 重新整形以配合版面寬度。
說明
--filter-expression是在讀取之後才執行的,所以它縮小的是輸出,不是帳單。#filter0透過--expression-attribute-names代表Year,因為Year是保留字。--expression-attribute-values要求數字被引號包兩層:外層是 shell 對 JSON 的引號,內層是把值寫成 JSON 字串。少了內層引號根本到不了 DynamoDB — CLI 會在本機就拒絕它,訊息是Invalid type for parameter ExpressionAttributeValues.:v.N, value: 2010, type: <class 'int'>, valid types: <class 'str'>。--page-size才是會改變 API 呼叫的那個旗標。它會成為每一次底層請求的Limit,限制每頁評估的項目數。分頁家族的其他成員(--max-items、--starting-token)都只是 CLI 在管理自己的輸出。- 平行掃描需要每個工作者各自帶
--segment N --total-segments M,而且每個工作者要維護自己的--starting-token。它買到的是牆鐘時間,不是容量。
改用視覺化操作
DynamoDB Expression Builder 會輸出過濾條件與兩張 JSON 對應表,而且已經替 shell 跳脫好,省掉那層讓 CLI 運算式在 DynamoDB 看到之前就失敗的引號問題。
想用 GUI 探索資料表,並使用可過濾、可分頁的表格,請下載 DynoTable,而不是在終端機裡盲目掃描。
相關指南
- Query 與 Scan 的比較 — 什麼時候(很少)
scan才說得過去。 - 為什麼我的 DynamoDB Scan 又慢又貴? — 成本模型與如何避開它。
- DynamoDB ProvisionedThroughputExceededException — 全表掃描會對一張佈建容量資料表造成什麼影響。
- DynamoDB ThrottlingException — 另一種節流,以及指數退避如何處理它。