"Too Many Items": muitos itens solicitados para a chamada BatchGetItem

TL;DR — BatchGetItem recupera no máximo 100 itens por chamada (e ≤16 MB de dados). Você solicitou mais de 100 chaves, então DynamoDB rejeitou a solicitação. Divida suas chaves em blocos de 100 ou menos e emita um BatchGetItem por bloco.

O que significa

ValidationException: 1 validation error detected: Value at 'RequestItems.<table-name>.member.Keys' failed to satisfy constraint: Member must have length less than or equal to 100

# on DynamoDB Local the same call is rejected with a shorter sentence:
ValidationException: Too many items requested for the BatchGetItem call

BatchGetItembusca itens por chave primária em uma ou mais tabelas, mas uma única chamada é limitada a **100 chaves** e **16 MB** de dados retornados. Solicite mais de 100 e o DynamoDB rejeitará toda a chamada. Mesmo dentro do limite, uma resposta pode retornar menos itens do que o solicitado (teto de 16 MB), reportando o restante emUnprocessedKeys. O caso acima do limite é um HTTP 400 ValidationException`, que não pode ser repetido até ser redimensionado.

Por que isso acontece

  • Solicitando um grande conjunto de chaves em uma chamada — passando centenas de chaves diretamente para o BatchGetItem.
  • Um pedaço vinculado acima de 100 — lote por contagem, mas usando o irmão do limite BatchWrite de 25 itens incorretamente ou um intervalo por um, deixando 101 passar.
  • Contando tabelas, não chaves — o limite de 100 é o total de chaves em todas as tabelas da solicitação.
  • Sem paginação UnprocessedKeys — assumindo que uma chamada retorna tudo, então você nunca fragmenta.

Como corrigir

  1. Agrupe as chaves em grupos de ≤100 e envie um BatchGetItem por bloco.
  2. Handle UnprocessedKeys — tente novamente qualquer chave retornada com espera exponencial; isso acontece mesmo dentro de um lote válido de 100 chaves quando o limite de 16 MB é atingido.
  3. Mantenha as respostas abaixo de 16 MB — com itens grandes, solicite menos de 100 por chamada.
  4. Saiba o que seu SDK faz por você — os clientes de baixo nível e o cliente de documento JavaScript não dividem uma lista de chaves muito grande; você mesmo deve chegar a 100. Alguns clientes de nível superior (o cliente aprimorado do Java SDK e v1 DynamoDBMapper) tentam pelo menos repetir itens não processados automaticamente.
  5. Desduplicar chaves antes da fragmentação. Chaves duplicadas em um lote falham separadamente – desduplicar primeiro e depois fragmentar.

Reproduza

Um BatchGetItem pedindo 101 chaves, uma além do limite:

const Keys = Array.from({length: 101}, (_, i) => ({pk: {S: `K#${i}`}, sk: {S: 'META'}}));
await client.send(new BatchGetItemCommand({RequestItems: {orders: {Keys}}}));

Este falha rapidamente no formato da solicitação – nenhuma leitura parcial acontece e nada chega ao UnprocessedKeys. Essa é a diferença entre exceder o limite de 100 chaves e exceder o limite de resposta de 16 MB, o que retorna resultados parciais.

Pelo DynoTable

Leia em lote menos de 100 chaves por vez no DynoTable enquanto você depura - abra a tabela com ⌘K, filtre para seu conjunto de chaves e confirme se os itens existem antes de conectar o BatchGetItem fragmentado no código. A calculadora de tamanho de item ajuda a escolher um tamanho de pedaço seguro quando os itens são grandes.

Use o Query Builder para criar primeiro o protótipo de leituras de chave única. Alternar perfis com ⌘P; Testar conexão em Configurações → Perfis. Consulte Conectar ao AWS e Instalar.

Fontes

Erros relacionados

Referências

Última verificação em 13/07/2026 em relação à documentação oficial do AWS vinculada acima.

Reproduzido em 26/07/2026 em DynamoDB Local 2.x com AWS SDK para JavaScript v3.1095.0 - a saída acima é literal.

ValidationException: Too many items requested for the BatchGetItem call
HTTP 400

Trabalhe com o DynamoDB sem o Console

Um cliente desktop rápido para DynamoDB que roda o SQL de verdade que o DynamoDB não consegue — JOINs, GROUP BY, agregações — com edição visual e um agente de IA com suas próprias chaves do Bedrock.

Teste grátis de 30 dias, sem cartão de crédito — depois o plano Grátis sem limite de tempo.