Pemula6 menit baca

Cara menghapus banyak item di DynamoDB

Tidak ada DELETE FROM table WHERE … di DynamoDB. Setiap delete menargetkan satu item by primary key lengkapnya — API tidak punya operasi bulk-delete, tidak ada truncate, dan pernyataan DELETE menghapus tepat satu item per pernyataan. Jadi "hapus banyak item" selalu pekerjaan dua langkah: temukan key-nya, lalu keluarkan satu delete per key, di-batch untuk throughput.

Panduan ini mencakup opsi batching, varian transaksional all-or-nothing, kasus hapus-semuanya, dan cara melakukan hal yang sama dengan seleksi dan dua keystroke di GUI.

Bagaimana saya menghapus banyak item di DynamoDB?

Kumpulkan primary key item yang ingin dihilangkan (via Query atau Scan), lalu hapus dalam batch: BatchWriteItem mengambil hingga 25 DeleteRequest per panggilan, TransactWriteItems menghapus hingga 100 item secara atomik, dan pernyataan PartiQL DELETE bisa di-batch 25 sekaligus dengan BatchExecuteStatement. Di DynoTable Anda memilih baris dan tekan ⌘⌫ untuk men-stage delete, lalu tinjau dan commit.

Langkah 0: kumpulkan key-nya

Delete membutuhkan seluruh primary key — pada tabel itu partition key dan sort key (AWS: "For each primary key, you must provide all of the key attributes"). Anda tidak bisa menghapus by atribut arbitrer, jadi "hapus setiap item di mana status = 'archived'" dimulai dengan baca:

  • Jika kondisi hidup di key (atau key GSI), Query tertarget mengumpulkan key dengan murah.
  • Kalau tidak, itu Scan dengan filter — yang membaca (dan menagih) seluruh tabel, ada filter atau tidak; lihat query vs scan.

Pakai ProjectionExpression yang hanya mengembalikan atribut key, dan ikuti LastEvaluatedKey sampai akhir (pagination) atau Anda diam-diam hanya menghapus senilai halaman 1 MB pertama.

Method 1: BatchWriteItem (hingga 25 delete per panggilan)

BatchWriteItem menggabungkan hingga 25 request put/delete atau 16 MB per panggilan (referensi API AWS: "satu panggilan BatchWriteItem dapat mengirim hingga 16MB data lewat jaringan, terdiri atas maksimum 25 operasi put atau delete item").

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

Tiga properti batch yang menjebak orang — semua langsung dari referensi API:

  • Tidak atomik: "masing-masing operasi PutItem dan DeleteItem yang disebutkan di dalam BatchWriteItem bersifat atomik; tetapi BatchWriteItem secara keseluruhan tidak." Beberapa delete bisa mendarat sementara yang lain tidak.
  • Anda harus retry UnprocessedItems. Request yang di-throttle kembali di map respons UnprocessedItems, dalam bentuk yang sama dengan request — "Typically, you would call BatchWriteItem in a loop", dan AWS "strongly recommend[s] that you use an exponential backoff algorithm" antar retry.
  • Tanpa kondisi. "You cannot specify conditions on individual put and delete requests" — conditional delete harus lewat DeleteItem atau transaksi. Batch juga menolak dua operasi pada key yang sama dalam satu panggilan.

Bentuk loop — chunk by 25, kirim, re-queue sisa dengan backoff — sama dengan yang dibahas di operasi batch.

Method 2: TransactWriteItems (delete atomik)

Saat himpunan delete harus berhasil atau gagal bersama — menghapus item parent dan child -nya, misalnya — pakai TransactWriteItems: hingga 100 aksi (delete, put, update, condition check) diterapkan secara atomik, dengan per-item diizinkan. Trade-nya: write transaksional menelan dua kali kapasitas tulis write polos. Mekanika penuh (token idempotency, TransactionCanceledException, matematika biaya) di transaksi DynamoDB.

Method 3: PartiQL DELETE, di-batch

PartiQL tidak mengangkat aturan per-key — ia hanya mengeja ulang. Developer guide eksplisit (PartiQL DELETE): "Anda hanya bisa menghapus satu item pada satu waktu. Anda tidak bisa mengeluarkan satu pernyataan PartiQL DynamoDB yang menghapus banyak item", dan kondisi WHERE "harus mengerucut ke satu nilai primary key".

Untuk menghapus beberapa item Anda batch pernyataan single-item — BatchExecuteStatement menjalankan hingga 25 pernyataan per batch (semua baca atau semua tulis, tidak pernah dicampur):

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

WHERE yang tidak menyematkan key penuh gagal — tidak ada DELETE FROM Orders WHERE status = 'archived'. Lebih banyak pattern PartiQL (dan limit di baliknya) di contoh PartiQL dan PartiQL vs SQL.

Menghapus SEMUA item (truncate)

DynamoDB tidak punya truncate. Opsi Anda, dalam urutan preferensi:

  1. Hapus dan recreate tabel. Penghapusan item-by-item seluruh tabel menagih satu write per item; DeleteTable + CreateTable menghindari seluruh tagihan tulis. Pengaturan tabel — indeks, TTL, , mode kapasitas, tags — tidak kembali sendiri; Anda deklarasikan ulang saat pembuatan (infrastructure-as-code menjadikan ini non-event).
  2. Expire item dengan . Jika "hapus semua yang lebih tua dari X" benar-benar yang Anda inginkan, TTL menghapus item expired di latar tanpa mengonsumsi kapasitas tulis — bulk delete gerak lambat yang tidak menelan biaya.
  3. Scan + batch-delete (Method 1) saat tabel harus tetap live dan hanya subset yang pergi — Anda membayar baca per item yang di-scan plus write per item yang dihapus.

Hapus banyak item di DynoTable

Alur select-then-delete di atas — query, kumpulkan key, chunk, retry — tepat busywork yang harus dimiliki GUI. Di DynoTable itu seleksi grid:

  1. Jalankan atau filter query agar baris yang ingin hilang ada di layar.
  2. Pilih dan tekan ⌘⌫ — setiap baris terpilih menjadi staged delete. Belum ada yang menyentuh DynamoDB: baris berwarna merah di grid dan muncul sebagai kartu yang bisa ditinjau di panel staging.
  3. Tinjau, lalu Commit. Commit dikirim sebagai batch TransactWriteItems dengan kondisi optimistic-locking — staged delete hanya lewat jika item masih ada — dan stage besar otomatis di-chunk agar tetap dalam limit transaksi DynamoDB. ⌘⇧⌫ melewatkan review dan delete-and-commit seleksi dalam satu chord.
Staged delete di DynoTable: baris terpilih berwarna merah di grid, masing-masing kartu yang bisa ditinjau di panel staging sebelum commit.
Staged delete di DynoTable: baris terpilih berwarna merah di grid, masing-masing kartu yang bisa ditinjau di panel staging sebelum commit.

Anda menghapus baris yang Anda pilih — operasi yang ditinjau, recoverable-until-commit — bukan truncate full-table buta. Untuk menghapus seluruh tabel, drop dan recreate (di atas).

Jika delete butuh kondisi buatan tangan (attribute_exists, cek versi), bangun ConditionExpression exact + map placeholder di DynamoDB Expression Builder dan tempelkan ke DeleteItem atau transaksi.

FAQ

Bisakah saya menghapus banyak item dalam satu panggilan DynamoDB? Ya — hingga 25 dengan BatchWriteItem (best-effort, retry UnprocessedItems) atau hingga 100 secara atomik dengan TransactWriteItems. Keduanya mengambil primary key penuh per item; tidak ada yang menerima kondisi "where" untuk memilih item.

Apakah ada DELETE WHERE di DynamoDB? Tidak. Baik API tingkat rendah maupun PartiQL tidak bisa menghapus by kondisi — DELETE PartiQL memerlukan WHERE yang "resolve[s] to a single primary key value". Anda Query atau Scan untuk key dulu, lalu hapus masing-masing.

Bagaimana saya menghapus semua item di tabel DynamoDB? Untuk wipe penuh, hapus dan recreate tabel — menghindari membayar satu write per item. Untuk cleanup berbasis usia, pakai TTL, yang menghapus item expired tanpa mengonsumsi kapasitas tulis. Scan + batch-delete adalah fallback saat tabel harus tetap live.

Mengapa item muncul lagi setelah batch delete saya? Hampir selalu UnprocessedItems yang tidak di-retry: BatchWriteItem yang di-throttle diam-diam mengembalikan delete yang gagal di respons, dan kode yang tidak loop di atasnya "selesai" dengan item masih di tabel. Retry dengan exponential backoff sampai map kembali kosong.

Berapa biaya menghapus item? Setiap delete adalah write standar (satu WCU per 1 KB, digandakan di dalam transaksi), dan menemukan key juga menelan baca. Perkirakan kerusakannya dengan kalkulator harga.

Prefer melihat apa yang Anda hapus dulu? Unduh DynoTable — pilih baris, stage delete dengan ⌘⌫, tinjau diff, dan commit saat Anda yakin.

Diperbarui