Segment must be less than TotalSegments

TL;DR — 在一次並行 Scan中,每個 worker 設定 Segment(它的切片索引)和 TotalSegments(有多少個切片)。DynamoDB 要求 0 ≤ Segment < TotalSegments,且兩者必須一起提供。一個等於或高於 TotalSegmentsSegment 會被拒絕。為每個 worker 分配一個從 0TotalSegments − 1 的不同 Segment

這是什麼意思

ValidationException: The Segment parameter is zero-based and must be less than parameter TotalSegments: Segment: 5 is not less than TotalSegments: 2

# on DynamoDB Local the same call reports the constraint generically instead:
ValidationException: 1 validation error detected: Value '5' at 'segment' failed to satisfy constraint: Member must have value less than or equal to 1

一次並行掃描把表分成 TotalSegments 個切片;每個 worker 掃描由 Segment 標識的一個切片。有效的 Segment 值是 0TotalSegments − 1TotalSegments 本身必須在 11,000,000 之間。如果你提供了其中一個而沒有另一個,或者一個越界的 Segment,DynamoDB 會拒絕該呼叫。它是一個 HTTP 400 ValidationException,屬於用戶端錯誤,在引數有效之前不可重試。

為什麼會發生

  • 差一的段分配——當 TotalSegments = 4 時,使用 Segment1..4 而不是 0..3
  • Segment ≥ TotalSegments——一個達到或超過切片數量的 worker 索引。
  • 只提供了這對中的一個——傳入 Segment 而沒有 TotalSegments(或反之);並行掃描兩者都需要。
  • 一個動態 worker 池的不匹配——TotalSegments 設為一個與實際啟動的 worker 數量不同的值,因此一些 worker 得到越界的索引。

如何修正

  1. 分配段 0TotalSegments − 1——每個 worker 一個不同的 Segment
  2. 在每個並行掃描請求上總是一起傳入兩個引數
  3. TotalSegments 等於 worker 數量且在 1..1,000,000 內(TotalSegments1 就只是一次順序掃描)。
  4. 使用從零開始的索引,在把一個 worker 的序號對映到它的 Segment 時。

範例

const totalSegments = workers.length;
await Promise.all(
  workers.map((_, segment) =>
    doc.send(
      new ScanCommand({
        TableName: 'Orders',
        Segment: segment, // 0 .. totalSegments - 1
        TotalSegments: totalSegments
      })
    )
  )
);

在 DynoTable 中

在生產中並行化 Scan 之前,請在 DynoTable 中執行單段 Scan 以確認表和過濾器的行為符合預期。使用 ⌘K 開啟表,從查詢面板執行 Scan,然後檢查返回的項目 - 你會看到每個段將接觸的資料,而無需啟動工作佇列。當你將 Scan 移至程式碼中時,在 Query Builder 中對請求進行原型設計 — 它會發出 SegmentTotalSegments 以及完整的 Scan 引數。設定→設定檔案中的Profile切換(⌘P)和Test Connection使工作人員能夠指向正確的帳戶。參見連線 AWS安裝。請記住,段是從零開始的:對於四個工作人員,有效值為 0、1、2 和 3,而不是 1 到 4。當工作人員計數和 TotalSegments 匹配但一名工作人員仍然失敗時,偏離一的段分配是最常見的原因。

來源

相關錯誤

參考資料

最後核實於 2026-07-13,依據上方連結的 AWS 官方文件。

不必透過主控台就能操作 DynamoDB

一款快速的 DynamoDB 桌面用戶端,可執行 DynamoDB 無法執行的真正 SQL — JOINs、GROUP BY、聚合 — 並支援視覺化編輯與使用你自己的 Bedrock 金鑰的 AI 代理。

30 天免費試用,無需信用卡 — 之後為無時間限制的免費方案。