DynamoDB 表的大小與項數
沒有一個可以廉價地指向 DynamoDB 表的 SELECT COUNT(*)。對於"這張表有多大?",DynamoDB 給你兩種截然不同的答案:一個免費的估計值,可能滯後長達六小時;以及一個精確計數,代價是把整張表完整讀一遍。大多數"為什麼我的項數不對?"的困惑,都源於選了其中一個卻期待另一個的行為。
如何獲取一張 DynamoDB 表的項數和大小?
呼叫 DescribeTable:它免費返回 ItemCount 和 TableSizeBytes,但"DynamoDB 大約每六小時更新一次該值。最近的更改可能不會反映在該值中"(AWS API 參考)。要拿到精確數字,執行一次帶 --select COUNT 的 Scan——它只返回計數,但會讀取(並計費)每一個項。像 DynoTable 這樣的圖形介面會在每張表上顯示這些估計值,並能按需計算精確計數。
| 你想要 | 用 | 成本 | 新鮮度 |
|---|---|---|---|
| 大致的計數 + 大小,免費 | DescribeTable | 無(後設資料呼叫) | 約 6 小時滯後 |
| 精確的總計數 | 帶 Select COUNT 的 Scan | 讀取整張表 | 實時 |
| 單個鍵的精確計數 | 帶 Select COUNT 的 Query | 讀取匹配的項 | 實時 |
| 某個篩選子集的計數 | Scan/Query + 篩選 + COUNT | 讀取所有_被掃描_的內容 | 實時 |
方法 1:DescribeTable(免費,約 6 小時滯後)
DescribeTable 是一次後設資料查詢——它不讀取任何項,因此不消耗讀取容量,而且它正好攜帶你要的那兩個數字:
aws dynamodb describe-table --table-name Orders \
--query 'Table.[ItemCount, TableSizeBytes]'兩個數字都帶著同一條告誡,逐字出自 API 參考:"DynamoDB 大約每六小時更新一次該值。最近的更改可能不會反映在該值中。"所以一張你剛剛批次灌入資料的表可能連續幾小時報告 ItemCount: 0——這個數字沒有錯,它只是一個快照。
同一個響應還攜帶逐索引的數字:每個 GSI 和 LSI 都以同樣的六小時節奏報告自己的 ItemCount 和 IndexSizeBytes。把一個 的項數與整張表的項數對比,是一次不錯的免費健康檢查——它告訴你實際攜帶索引鍵的項有多少。
方法 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)拆分工作,再把各段的計數加起來。
對子集計數
- 單個分割區索引鍵下的項:帶
--select COUNT的Query——唯讀取該鍵下的項,資料有多小它就有多便宜。這是給一個 計數的正確方式。 - 匹配某個篩選的項:加一個
FilterExpression——但記住你被計費的數量是ScannedCount,不是Count:DynamoDB 是在讀取_之後_才篩選的,所以透過帶篩選的掃描去"數已歸檔的訂單",要為每一個訂單付費。一個很高的ScannedCount挨著一個很小的Count,正是這個篩選想變成一個 GSI 的訊號——參見篩選策略。
對於更豐富的問題——按狀態計數、求和、平均——DynamoDB 完全沒有 GROUP BY;各種變通辦法在計數、求和與聚合。(或者乾脆跳過變通辦法:DynoTable 的 SQL Workbench 會在用戶端執行 GROUP BY 和聚合。)
DynoTable 中的表大小和項數
DynoTable 把兩種答案都放在你正在看的地方。每張開啟的表在標籤頁工具欄裡都有一個 設定 按鈕;它開啟的對話方塊顯示:
- 主索引鍵和次要索引——一眼看清表的形狀。
- 項數 · 大小 · 平均項大小——DynamoDB 自己的
DescribeTable估計值,明確標註為估計值,六小時的告誡懸停即見。 - Index table(索引表)——在 索引 區段,一次一鍵的抽樣掃描,記錄它所發現的屬性(包括
commonData.status這樣的巢狀路徑),帶實時進度。該掃描有上限,因此稀有屬性可能會缺失;上限見表總覽與索引。它驅動欄位自動補全和推斷出的 TypeScript / Zod / JSON Schema 匯出,並且會產生正常的 DynamoDB 讀取費用——應用會事先明說。

至於精確數字,內建的 AI 智慧體可以按需在整張表上計算計數、求和與按組細分——它讀取每一個匹配的項而不是抽樣一頁,並且在執行任何消耗讀取容量的操作之前都會先詢問。
常見問題
為什麼我的 DynamoDB 項數不對?
它不是錯的——它是陳舊的。ItemCount(和 TableSizeBytes)"大約每六小時"重新整理一次,所以最近的寫入和刪除還沒反映出來。主控台的表概覽顯示的就是同樣的 DescribeTable 數字,帶著同樣的滯後。
如何精確統計 DynamoDB 的行數?
aws dynamodb scan --table-name X --select COUNT——CLI 會翻完整張表並把各頁的計數加總。它是精確的,但計費的讀取容量與取回每一個項相同。
DescribeTable 免費嗎? 它不消耗讀取容量——它是後設資料呼叫,不是資料讀取,所以輪詢它不會碰到你表的吞吐量。
如何知道單個項的大小? DynamoDB 按項大小計量(寫入按每 1 KB、讀取按每 4 KB 向上取整)。把一個項貼上進項大小計算器看它的計費大小,上限見 400 KB 項大小限制。
項數會影響我的賬單嗎?
儲存按 TableSizeBytes 計費,請求按項大小 × 請求次數計費——並不直接按項數。把你表的數字填進定價計算器,就能看到按需和預置兩種模式下的月度全貌。
想讓表的形狀、估計值和已索引欄位一鍵可見?下載 DynoTable,在任意表上開啟統計面板。


