Segment must be less than TotalSegments

TL;DR — Dans un Scan parallèle, chaque worker définit Segment (son index de tranche) et TotalSegments (combien de tranches). DynamoDB exige 0 ≤ Segment < TotalSegments, et les deux doivent être fournis ensemble. Un Segment égal ou supérieur à TotalSegments est rejeté. Attribue à chaque worker un Segment distinct de 0 à TotalSegments − 1.

Ce que ça signifie

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

Un scan parallèle divise la table en TotalSegments tranches ; chaque worker scanne une tranche identifiée par Segment. Les valeurs valides de Segment vont de 0 à TotalSegments − 1. TotalSegments lui-même doit être compris entre 1 et 1 000 000. Si tu fournis l'un sans l'autre, ou un Segment en dehors de la plage, DynamoDB rejette l'appel. C'est une ValidationException HTTP 400, côté client, et non réessayable tant que les paramètres ne sont pas valides.

Pourquoi ça arrive

  • Attribution de segment décalée d'un — avec TotalSegments = 4, utiliser les valeurs de Segment 1..4 au lieu de 0..3.
  • Segment ≥ TotalSegments — un index de worker qui atteint ou dépasse le nombre de tranches.
  • Un seul membre de la paire fourni — passer Segment sans TotalSegments (ou inversement) ; les deux sont requis pour un scan parallèle.
  • Un décalage de pool de workers dynamiqueTotalSegments défini à une valeur différente du nombre de workers réellement lancés, si bien que certains workers reçoivent des index hors plage.

Comment le corriger

  1. Attribue les segments 0 à TotalSegments − 1 — un Segment distinct par worker.
  2. Passe toujours les deux paramètres ensemble sur chaque requête de scan parallèle.
  3. Garde TotalSegments égal au nombre de workers et dans 1..1 000 000 (un TotalSegments de 1 est simplement un scan séquentiel).
  4. Utilise une indexation à base zéro lors du mappage de l'ordinal d'un worker vers son Segment.
  5. Journalise les deux paramètres sur chaque worker. Quand une flotte échoue, le message d'erreur nomme le Segment et le TotalSegments fautifs — compare-les à ce que chaque processus a réellement envoyé.

Exemple

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

Dans DynoTable

Avant de paralléliser un Scan en production, lance un Scan single-segment dans DynoTable pour confirmer que la table et le filtre se comportent comme attendu. Ouvre la table avec ⌘K, lance un Scan depuis le panneau de requête, et inspecte les items renvoyés — tu vois les données que chaque segment toucherait sans lancer une flotte de workers.

Quand tu déplaces le Scan dans le code, prototype la requête dans le Query Builder — il émet Segment et TotalSegments à côté des paramètres Scan complets. Le basculement de profil (⌘P) et Test Connection dans Settings → Profiles gardent les workers pointés sur le bon compte. Voir Connect to AWS et Install. Souviens-toi que les segments sont à base zéro : avec quatre workers, les valeurs valides sont 0, 1, 2 et 3 — pas 1 à 4. L'attribution de segment décalée d'un est la cause la plus fréquente quand le nombre de workers et TotalSegments matchent mais qu'un worker échoue quand même.

Sources

Erreurs liées

Références

Dernière vérification le 2026-07-13 par rapport à la documentation officielle AWS liée ci-dessus.

Travaille avec DynamoDB sans la Console

Un client de bureau rapide pour DynamoDB qui exécute le vrai SQL que DynamoDB ne peut pas — JOINs, GROUP BY, agrégations — avec édition visuelle et un agent IA sur tes propres clés Bedrock.

Essai gratuit de 30 jours, sans carte bancaire — ensuite la formule Gratuit, sans limite de durée.