如何取得 DynamoDB 資料表的大小與項目數量
沒有一個可以便宜地對著 DynamoDB 資料表跑的 SELECT COUNT(*)。
對於「這張資料表有多大?」,DynamoDB 給你兩種截然不同的答案:一個
免費的估計值,可能過時多達六小時;以及一個精確計數,
代價是把整張資料表讀一遍。大多數「為什麼我的項目數量不對?」的
困惑,都是選了其中一個卻期待另一個的行為。
我要如何取得 DynamoDB 資料表的項目數量與大小?
呼叫 DescribeTable:它免費回傳 ItemCount 與 TableSizeBytes,但
「DynamoDB 大約每六小時更新一次這個值。最近的變更
可能尚未反映在這個值中」
(AWS API 參考)。
要精確的數字,就跑一次帶 --select COUNT 的 Scan——它只回傳
計數,但會讀取(並計費)每一個項目。像
DynoTable 這樣的 GUI 會在每張資料表上顯示估計值,也能
按需計算精確計數。
| 你想要 | 用 | 成本 | 新鮮度 |
|---|---|---|---|
| 大概的數量+大小,免費 | DescribeTable | 無(中繼資料呼叫) | 過時約 6 小時 |
| 精確的總計數 | Scan 搭配 Select COUNT | 讀取整張資料表 | 即時 |
| 單一索引鍵的精確計數 | Query 搭配 Select COUNT | 讀取相符的項目 | 即時 |
| 過濾後子集的計數 | 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)拆分工作,再把各分段的計數加總。
計數一個子集
- 單一分割區索引鍵底下的項目:
Query搭配--select COUNT——只讀取 那個索引鍵的項目,所以資料多小就多便宜。這是計數一個 的正確方式。 - 符合某個過濾的項目: 加一個
FilterExpression——但記住 你被計費的是ScannedCount,不是Count:DynamoDB 是在讀取 之後 才過濾,所以透過過濾掃描「數一數封存的訂單」要為 每一筆訂單付費。高ScannedCount配上小Count,正是一個 想變成 GSI 的過濾的特徵——見 過濾策略。
至於更豐富的問題——按狀態計數、加總、平均——DynamoDB 完全沒有
GROUP BY;替代做法在
計數、加總與彙總。
DynoTable 中的資料表大小與項目數量
DynoTable 把兩種答案都放在你本來就在看的地方。每張 打開的資料表在分頁工具列上都有一個 Stats 按鈕(長條圖圖示); 面板顯示:
- 主索引鍵與次要索引——一眼看清資料表的形狀。
- Items · Size · Avg item——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,在任何資料表上打開 Stats 面板。


