入門閱讀時間 2 分鐘

如何取得 DynamoDB 資料表的大小與項目數量

沒有一個可以便宜地對著 DynamoDB 資料表跑的 SELECT COUNT(*)。 對於「這張資料表有多大?」,DynamoDB 給你兩種截然不同的答案:一個 免費的估計值,可能過時多達六小時;以及一個精確計數, 代價是把整張資料表讀一遍。大多數「為什麼我的項目數量不對?」的 困惑,都是選了其中一個卻期待另一個的行為。

我要如何取得 DynamoDB 資料表的項目數量與大小?

呼叫 DescribeTable:它免費回傳 ItemCountTableSizeBytes,但 「DynamoDB 大約每六小時更新一次這個值。最近的變更 可能尚未反映在這個值中」 (AWS API 參考)。 要精確的數字,就跑一次帶 --select COUNTScan——它只回傳 計數,但會讀取(並計費)每一個項目。像 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 都以同樣的六小時節奏回報自己的 ItemCountIndexSizeBytes。 把一個 的項目數量和資料表的比一比,是一個 不錯的免費健康檢查——它告訴你有多少項目真的帶著那個索引 鍵。

方法 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 讀取成本——應用程式會事先講清楚。
DynoTable 中的資料表統計面板:索引鍵與索引、Items / Size / Avg item 估計值列,以及已建索引的欄位清單。
DynoTable 中的資料表統計面板:索引鍵與索引、Items / Size / Avg item 估計值列,以及已建索引的欄位清單。

至於精確的數字,內建的 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 面板。

已更新