入門閱讀時間 2 分鐘

DynamoDB 表的大小與項數

沒有一個可以廉價地指向 DynamoDB 表的 SELECT COUNT(*)。對於"這張表有多大?",DynamoDB 給你兩種截然不同的答案:一個免費的估計值,可能滯後長達六小時;以及一個精確計數,代價是把整張表完整讀一遍。大多數"為什麼我的項數不對?"的困惑,都源於選了其中一個卻期待另一個的行為。

如何獲取一張 DynamoDB 表的項數和大小?

呼叫 DescribeTable:它免費返回 ItemCountTableSizeBytes,但"DynamoDB 大約每六小時更新一次該值。最近的更改可能不會反映在該值中"(AWS API 參考)。要拿到精確數字,執行一次帶 --select COUNTScan——它只返回計數,但會讀取(並計費)每一個項。像 DynoTable 這樣的圖形介面會在每張表上顯示這些估計值,並能按需計算精確計數。

你想要成本新鮮度
大致的計數 + 大小,免費DescribeTable無(後設資料呼叫)約 6 小時滯後
精確的總計數Select COUNTScan讀取整張表實時
單個鍵的精確計數Select COUNTQuery讀取匹配的項實時
某個篩選子集的計數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)拆分工作,再把各段的計數加起來。

對子集計數

  • 單個分割區索引鍵下的項:--select COUNTQuery——唯讀取該鍵下的項,資料有多小它就有多便宜。這是給一個 計數的正確方式。
  • 匹配某個篩選的項:加一個 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 讀取費用——應用會事先明說。
DynoTable 中的資料表對話方塊:鍵與索引、項數 / 大小 / 平均項大小估計行,以及已索引欄位列表。
DynoTable 中的資料表對話方塊:鍵與索引、項數 / 大小 / 平均項大小估計行,以及已索引欄位列表。

至於精確數字,內建的 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,在任意表上開啟統計面板。

已更新