Principiante8 min di lettura

Come eliminare più elementi in DynamoDB

Non c'è "DELETE FROM table WHERE..." in DynamoDB. Ogni eliminazione prende di mira uno elemento con la tua chiave primaria completa: API non ha operazioni di eliminazione in blocco, no troncare eL'istruzione "DELETE" rimuove esattamente un elemento per dichiarazione. Quindi "eliminare più elementi" è sempre un lavoro in due passaggi: trova il file chiavi, quindi eseguire un'eliminazione per chiave, raggruppate per velocità effettiva.

Questa guida copre le opzioni di raggruppamento, le transazioni tutto o niente variante, il caso elimina tutto e come fare la stessa cosa con a selezione e due sequenze di tasti in una GUI.

Come posso eliminare più elementi in DynamoDB?

Raccogli le chiavi primarie degli oggetti che vuoi eliminare (tramite Query o Scan), quindi eliminali in batch: BatchWriteItem richiede fino a 25 DeleteRequest per chiamata, TransactWriteItems elimina fino a 100 elementi in modo atomico e PartiQL Le istruzioni "DELETE" possono essere raggruppate in batch 25 alla volta con "BatchExecuteStatement". In DynoTable seleziona le righe e premi ⌘⌫ per mettere in scena le eliminazioni, quindi rivedi e conferma.

Passo 0: ritira le chiavi

Un'eliminazione richiede l'intera chiave primaria — su atabella quello è la chiave di partizione e la chiave di ordinamento (AWS: "Per ogni chiave primaria, devi fornire tutti gli attributi della chiave"). Tu non può eliminare con un attributo arbitrario, quindi "elimina ogni elemento dove status = 'archived'" inizia con una lettura:

  • Se la condizione risiede su una chiave (o una chiave GSI), a il Query mirato raccoglie le chiavi a buon mercato.
  • Altrimenti è un Scan con un filtro — che legge (e fattura) l'intero tabella, filtro o meno; vedere query vs scan.

Utilizza un ProjectionExpression che restituisca solo gli attributi chiave e segui LastEvaluatedKey fino alla fine (pagination) oppure elimina silenziosamente solo il valore della prima pagina da 1 MB.

Metodo 1: BatchWriteItem (fino a 25 eliminazioni per chiamata)

BatchWriteItem raggruppa fino a 25 richieste di inserimento/eliminazione o 16 MB per chiamata (riferimento AWS API: "Una singola chiamata a BatchWriteItem può trasmettere fino a 16 MB di dati su rete, composta da un massimo di 25 operazioni di inserimento o eliminazione di elementi").

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"}}}}
  ]
}'

Tre proprietà del batch fanno inciampare le persone, tutte direttamente dal Riferimento API:

  • Non atomico: "Le singole operazioni PutItem e DeleteItem specificati in BatchWriteItem sono atomici; tuttavia BatchWriteItem nel suo complesso non lo è." Alcune eliminazioni possono avvenire mentre altre no.
  • Devi riprovare con UnprocessedItems. Le richieste limitate ritornano nel file Mappa di risposta "UnprocessedItems", nella stessa forma della richiesta — "In genere, chiameresti BatchWriteItem in un ciclo", e AWS "fortemente consiglia[s] di utilizzare un algoritmo di backoff esponenziale" tra i tentativi.
  • Nessuna condizione. "Non è possibile specificare le condizioni sui singoli put e richieste di eliminazione" - un'eliminazione condizionale deve passare attraverso DeleteItem o a transazione invece. Un batch rifiuta anche due operazioni sulla stessa chiave in una chiamata.

La forma del ciclo (pezzo per 25, invio, riaccodamento degli avanzi con backoff) è lo stesso trattato in operazioni batch.

Metodo 2: TransactWriteItems (eliminazioni atomiche)

Quando una serie di eliminazioni deve avere esito positivo o negativo insieme: rimozione di un elemento principale l'oggetto e il tuobambini, diciamo — usa TransactWriteItems: fino a 100 azioni (eliminazioni, inserimenti, aggiornamenti, controlli delle condizioni) applicate atomicamente, con per articoloconsentito. Il commercio: una transazione la scrittura costa il doppio della capacità di scrittura di una scrittura semplice. La meccanica completa (token di idempotenza, TransactionCanceledException, matematica dei costi) sono presenti DynamoDB transazioni.

Metodo 3: PartiQL DELETE, batch

PartiQL non revoca la regola per tasto, la riscrive semplicemente. Lo sviluppatore la guida è esplicita (PartiQL ELIMINA): "Puoi eliminare solo un elemento alla volta. Non puoi emettere un singolo DynamoDB PartiQL istruzione che elimina più elementi" e la condizione WHERE "deve risolversi in un singolo valore di chiave primaria".

Per eliminare più elementi, raggruppa le dichiarazioni di un singolo elemento: BatchExecuteStatement esegue fino a 25 istruzioni per batch (tutte le letture o tutte le scritture, mai mescolate):

[
  {"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

Un WHERE che non blocca la chiave completa fallisce: non esiste DELETE FROM Ordini WHERE status = 'archiviato'. Altri modelli PartiQL (e il limiti dietro di loro) in PartiQL esempi e PartiQL vs SQL.

Eliminazione di elementi ALL (troncare)

DynamoDB non ha troncato. Le tue opzioni, in ordine di preferenza:

  1. Elimina e ricrea la tabella. Eliminazione articolo per articolo di un'intera tabella fatture una scrittura per articolo; DeleteTable + CreateTable elude il fattura intera scritta. Impostazioni tabella: indici, TTL,, modalità capacità, tag: non ritornano da soli; li dichiari nuovamente a creazione (l'infrastruttura come codice rende questo un non-evento).
  2. Scadenza articoli con. Se "elimina tutto ciò che è più vecchio di X" è davvero quello che vuoi, TTL elimina gli elementi scaduti nel background senza consumare capacità di scrittura: un'eliminazione collettiva al rallentatore quello non costa nulla.
  3. Scan + eliminazione batch (Metodo 1) quando la tabella deve rimanere attiva e ne va solo un sottoinsieme, paghi una lettura per elemento scansionato più una scrittura per elemento eliminato.

Elimina più elementi in DynoTable

Il flusso di selezione e eliminazione riportato sopra (interrogazione, raccolta chiavi, blocco, ripetizione) è esattamente il lavoro intenso che una GUI dovrebbe possedere. In DynoTable è una griglia selezione:

  1. Eseguire o filter una query in modo che le righe vuoi sparire sono sullo schermo.
  2. Selezionali e premi ⌘⌫: ogni riga selezionata diventa un stage eliminare. Nulla ha ancora toccato DynamoDB: le righe si tingono di rosso nella griglia e appaiono come schede rivedibili nel pannello di staging.
  3. Rivedi, quindi Conferma. Impegna la spedizione come batch TransactWriteItems con condizioni di blocco ottimistico: un'eliminazione graduale viene eseguita solo se il file l'elemento esiste ancora e le fasi di grandi dimensioni vengono automaticamente suddivise in blocchi per rimanere entro i limiti di transazione di DynamoDB. ⌘⇧⌫ salta la revisione e elimina e conferma la selezione in un accordo.
Eliminazioni graduali in DynoTable: righe selezionate colorate in rosso nella griglia, ciascuna è una scheda rivedibile nel pannello di gestione temporanea prima del commit.
Eliminazioni graduali in DynoTable: righe selezionate colorate in rosso nella griglia, ciascuna è una scheda rivedibile nel pannello di gestione temporanea prima del commit.

Elimini le righe selezionate: una riga rivista, operazione recuperabile fino al commit: non un troncamento cieco di una tabella completa. Per cancellando un'intera tabella, rilasciandola e ricreandola (sopra).

Se un'eliminazione richiede una condizione scritta a mano ("attribute_exists", un file version check), costruisci le esatte ConditionExpression + mappe segnaposto nel file DynamoDB Expression Builder e allegarlo a DeleteItem o transazione.

FAQ

Posso eliminare più elementi in una chiamata DynamoDB? Sì, fino a 25 con BatchWriteItem (al massimo, riprova con UnprocessedItems) o fino a 100 atomicamente con TransactWriteItems. Entrambi frequentano le primarie complete chiave per articolo; nessuno dei due accetta una condizione "dove" per selezionare gli elementi.

C'è un DELETE WHERE in DynamoDB? No. Né il API di basso livello né il PartiQL possono eliminare in base alla condizione: PartiQL "DELETE" richiede un "WHERE" che "si risolva in un singolo valore di chiave primaria". Prima esegui la query o la scansione delle chiavi, quindi le elimini ciascuna.

Come faccio a eliminare tutti gli elementi in una tabella DynamoDB? Per una cancellazione completa, elimina e ricrea la tabella: evita di pagare una scrittura per articolo. Per la pulizia basata sull'età, utilizzare TTL, che elimina elementi scaduti senza consumare capacità di scrittura. Scan + batch-delete è il fallback quando la tabella deve rimanere attiva.

Perché gli elementi ricompaiono dopo l'eliminazione batch? Quasi sempre "UnprocessedItems" non riprovati: un "BatchWriteItem" limitato restituisce silenziosamente le eliminazioni non riuscite nella risposta e il codice che non lo fa il ciclo su di essi "finisce" con gli elementi ancora nella tabella. Riprova con backoff esponenziale finché la mappa non torna vuota.

Quanto costa eliminare gli elementi? Ogni eliminazione è una scrittura standard (uno WCU per 1 KB, raddoppiato all'interno di un file transazione) e trovare le chiavi costa anche la lettura. Stima il danno con il calcolatore dei prezzi.

Preferisci vedere prima cosa stai eliminando? Scarica DynoTable — seleziona le righe, organizza le eliminazioni con ⌘⌫, rivedi le differenze e impegnati quando sei sicuro.

Aggiornato