Iniciante8 min de leitura

Como Excluir Vários Itens no DynamoDB

Não existe DELETE FROM table WHERE … no DynamoDB. Cada exclusão mira um item pela sua chave primária completa — a API não tem operação de exclusão em massa, não tem truncate, e a instrução DELETE do remove exatamente um item por instrução. Então "excluir vários itens" é sempre um trabalho de duas etapas: encontrar as chaves, e então emitir uma exclusão por chave, em lotes para ganhar throughput.

Este guia cobre as opções de lote, a variante transacional tudo-ou-nada, o caso excluir-tudo, e como fazer a mesma coisa com uma seleção e dois atalhos de teclado em uma GUI.

Como excluo vários itens no DynamoDB?

Colete as chaves primárias dos itens que você quer eliminar (via Query ou Scan), e então exclua-os em lotes: o BatchWriteItem aceita até 25 DeleteRequests por chamada, o TransactWriteItems exclui até 100 itens atomicamente, e instruções DELETE do PartiQL podem ser agrupadas 25 por vez com o BatchExecuteStatement. No DynoTable você seleciona as linhas e pressiona ⌘⌫ para preparar as exclusões, e então revisa e faz commit.

Etapa 0: colete as chaves

Uma exclusão precisa da chave primária inteira — em uma tabela de isso é a chave de partição e a chave de classificação (AWS: "Para cada chave primária, você deve fornecer todos os atributos da chave"). Você não pode excluir por um atributo arbitrário, então "excluir todo item onde status = 'archived'" começa com uma leitura:

  • Se a condição vive em uma chave (ou em uma chave de GSI), um Query direcionado coleta as chaves de forma barata.
  • Caso contrário é um Scan com filtro — que lê (e cobra) a tabela inteira, com ou sem filtro; veja query vs scan.

Use uma ProjectionExpression que retorne apenas os atributos de chave, e siga o LastEvaluatedKey até o fim (paginação) ou você vai silenciosamente excluir apenas o equivalente à primeira página de 1 MB.

Método 1: BatchWriteItem (até 25 exclusões por chamada)

O BatchWriteItem agrupa até 25 requisições de put/delete ou 16 MB por chamada (referência da API da AWS: "Uma única chamada de BatchWriteItem pode transmitir até 16MB de dados pela rede, consistindo em até 25 operações de put ou delete de itens").

aws dynamodb batch-write-item --request-items '{
  "Orders": [
    {"DeleteRequest": {"Key": {"PK": {"S": "ORDER#1001"}, "SK": {"S": "META"}}}},
    {"DeleteRequest": {"Key": {"PK": {"S": "ORDER#1002"}, "SK": {"S": "META"}}}},
    {"DeleteRequest": {"Key": {"PK": {"S": "ORDER#1003"}, "SK": {"S": "META"}}}}
  ]
}'

Três propriedades do lote pegam as pessoas de surpresa — todas direto da referência da API:

  • Ele não é atômico. "As operações individuais de PutItem e DeleteItem especificadas no BatchWriteItem são atômicas; porém o BatchWriteItem como um todo não é." Algumas exclusões podem entrar enquanto outras não.
  • Você deve refazer os UnprocessedItems. Requisições que sofreram throttling voltam no mapa UnprocessedItems da resposta, no mesmo formato da requisição — "Tipicamente, você chamaria o BatchWriteItem em um loop", e a AWS "recomenda fortemente que você use um algoritmo de exponential backoff" entre as tentativas.
  • Sem condições. "Você não pode especificar condições em requisições individuais de put e delete" — uma exclusão condicional tem que passar por um DeleteItem ou uma transação. Um lote também rejeita duas operações na mesma chave em uma chamada.

O formato do loop — fatiar de 25 em 25, enviar, re-enfileirar as sobras com backoff — é o mesmo coberto em operações em lote.

Método 2: TransactWriteItems (exclusões atômicas)

Quando um conjunto de exclusões precisa ter sucesso ou falhar junto — remover um item pai e os filhos da sua , por exemplo — use o TransactWriteItems: até 100 ações (exclusões, puts, updates, verificações de condição) aplicadas atomicamente, com por item permitidas. A troca: uma escrita transacional custa o dobro da capacidade de escrita de uma escrita comum. A mecânica completa (tokens de idempotência, TransactionCanceledException, matemática de custo) está em transações do DynamoDB.

Método 3: PartiQL DELETE, em lote

O PartiQL não elimina a regra por chave — ele só a reescreve. O guia do desenvolvedor é explícito (PartiQL DELETE): "Você só pode excluir um item por vez. Você não pode emitir uma única instrução PartiQL do DynamoDB que exclua vários itens", e a condição WHERE "deve resolver para um único valor de chave primária".

Para excluir vários itens você agrupa instruções de item único — o BatchExecuteStatement roda até 25 instruções por lote (todas leituras ou todas escritas, nunca misturadas):

[
  {"Statement": "DELETE FROM \"Orders\" WHERE PK = 'ORDER#1001' AND SK = 'META'"},
  {"Statement": "DELETE FROM \"Orders\" WHERE PK = 'ORDER#1002' AND SK = 'META'"}
]
aws dynamodb batch-execute-statement --statements file://statements.json

Um WHERE que não fixa a chave completa falha — não existe DELETE FROM Orders WHERE status = 'archived'. Mais padrões de PartiQL (e os limites por trás deles) em exemplos de PartiQL e PartiQL vs SQL.

Excluindo TODOS os itens (truncate)

O DynamoDB não tem truncate. Suas opções, em ordem de preferência:

  1. Exclua e recrie a tabela. A exclusão item a item de uma tabela inteira cobra uma escrita por item; DeleteTable + CreateTable evita a conta de escritas inteira. O porém: as configurações da tabela — índices, TTL, , modo de capacidade, tags — não voltam sozinhas; você as redeclara na criação (infraestrutura-como-código torna isso um não-evento).
  2. Expire itens com . Se "excluir tudo mais velho que X" é realmente o que você quer, o TTL exclui itens expirados em segundo plano sem consumir capacidade de escrita — uma exclusão em massa em câmera lenta que não custa nada.
  3. Scan + exclusão em lote (Método 1) quando a tabela precisa continuar no ar e só um subconjunto sai — você paga uma leitura por item escaneado mais uma escrita por item excluído.

Exclua vários itens no DynoTable

O fluxo selecionar-e-excluir acima — consultar, coletar chaves, fatiar, refazer — é exatamente o trabalho braçal que uma GUI deveria assumir. No DynoTable é uma seleção na grade:

  1. Rode ou filtre uma consulta para que as linhas que você quer eliminar estejam na tela.
  2. Selecione-as e pressione ⌘⌫ — cada linha selecionada vira uma exclusão preparada. Nada tocou o DynamoDB ainda: as linhas ficam tingidas de vermelho na grade e aparecem como cards revisáveis no painel de preparação.
  3. Revise, e então faça Commit. Os commits saem como lotes de TransactWriteItems com condições de optimistic locking — uma exclusão preparada só passa se o item ainda existir — e preparações grandes são automaticamente fatiadas para ficar dentro dos limites de transação do DynamoDB. ⌘⇧⌫ pula a revisão e exclui-e-commita a seleção em um único atalho.
Exclusões preparadas no DynoTable: linhas selecionadas tingidas de vermelho na grade, cada uma um card revisável no painel de preparação antes do commit.
Exclusões preparadas no DynoTable: linhas selecionadas tingidas de vermelho na grade, cada uma um card revisável no painel de preparação antes do commit.

O escopo é honesto: você exclui as linhas que selecionou — uma operação revisada, recuperável-até-o-commit — não um truncate cego de tabela inteira. Para zerar uma tabela inteira, drope e recrie-a (acima).

Se uma exclusão precisa de uma condição escrita à mão (attribute_exists, uma verificação de versão), monte a ConditionExpression exata + os mapas de placeholders no DynamoDB Expression Builder e anexe-a a um DeleteItem ou a uma transação.

FAQ

Posso excluir vários itens em uma única chamada do DynamoDB? Sim — até 25 com BatchWriteItem (melhor esforço, refaça os UnprocessedItems) ou até 100 atomicamente com TransactWriteItems. Ambos exigem uma chave primária completa por item; nenhum aceita uma condição "where" para selecionar os itens.

Existe DELETE WHERE no DynamoDB? Não. Nem a API de baixo nível nem o PartiQL conseguem excluir por condição — o DELETE do PartiQL exige um WHERE que "resolva para um único valor de chave primária". Você faz query ou scan pelas chaves primeiro, e então exclui cada uma.

Como excluo todos os itens de uma tabela DynamoDB? Para uma limpeza completa, exclua e recrie a tabela — isso evita pagar uma escrita por item. Para limpeza por idade, use TTL, que exclui itens expirados sem consumir capacidade de escrita. Scan + exclusão em lote é o plano B quando a tabela precisa continuar no ar.

Por que itens reaparecem depois do meu batch delete? Quase sempre UnprocessedItems não refeitos: um BatchWriteItem que sofreu throttling retorna silenciosamente as exclusões que falharam na resposta, e código que não faz loop sobre elas "termina" com itens ainda na tabela. Refaça com exponential backoff até o mapa voltar vazio.

Quanto custa excluir itens? Cada exclusão é uma escrita padrão (uma WCU por 1 KB, dobrada dentro de uma transação), e encontrar as chaves também custa leituras. Estime o estrago com a calculadora de preços.

Prefere ver o que está excluindo primeiro? Baixe o DynoTable — selecione as linhas, prepare as exclusões com ⌘⌫, revise os diffs e faça commit quando tiver certeza.

Atualizado