Bulk CUD Operation

Bulk CUD Operation #

Dalam sistem berskala menengah hingga besar, operasi Create, Update, Delete (CUD) jarang dilakukan satu per satu. Lebih sering, aplikasi harus memproses ratusan hingga jutaan data sekaligus — misalnya saat import Excel, sinkronisasi data eksternal, atau batch processing.

Di sinilah konsep Bulk CUD Operation muncul. Namun, meskipun terlihat sederhana, implementasi bulk CUD yang keliru dapat menghancurkan performa database, menyebabkan lock berkepanjangan, lonjakan I/O, bahkan downtime.

Artikel ini akan membahas:

  • Apa itu Bulk CUD Operation
  • Kenapa Bulk CUD sangat mempengaruhi performa database
  • Dampaknya terhadap query planner, index, dan locking
  • Best practice untuk mengoptimalkan Bulk CUD

Apa Itu Bulk CUD Operation? #

Bulk CUD Operation adalah proses melakukan operasi insert, update, atau delete terhadap banyak row dalam satu konteks eksekusi.

Contoh kasus umum:

  • Import data Excel (10.000 row)
  • Sinkronisasi data dari service eksternal
  • Batch update status order
  • Pembersihan data lama (cleanup job)

Contoh non-bulk (buruk):

INSERT INTO users (id, name) VALUES (1, 'A');
INSERT INTO users (id, name) VALUES (2, 'B');
-- diulang ribuan kali

Contoh bulk:

INSERT INTO users (id, name) VALUES
(1, 'A'),
(2, 'B'),
(3, 'C');

Atau:

UPDATE orders SET status = 'DONE'
WHERE id IN (1,2,3,4,5);

Kenapa Bulk CUD Sangat Mempengaruhi Database? #

Bulk CUD bukan sekadar “lebih banyak data” — ia mempengaruhi banyak komponen internal database secara bersamaan.

Write Amplification #

Setiap operasi CUD tidak hanya menulis ke table:

  • Data page
  • Index page (bisa banyak index)
  • WAL / Redo Log
  • MVCC version (Postgres)

Jika dilakukan satu per satu:

  • Overhead commit
  • Flush log berulang

Bulk CUD → amortisasi cost write.

Index Maintenance Cost #

Setiap row yang diubah:

  • Semua index terkait harus di-update

Masalah muncul ketika:

  • Terlalu banyak index
  • Index tidak relevan untuk workload write

Contoh:

UPDATE users SET last_login = now();

Jika tabel punya 7 index, maka 7 struktur B-Tree ikut berubah.

Bulk CUD memperbesar efek ini secara eksponensial.

Locking dan Concurrency #

Bulk operation cenderung:

  • Mengunci banyak row
  • Dalam waktu yang lebih lama

Efek samping:

  • Query lain menunggu
  • Deadlock
  • Throughput sistem turun

Terutama berbahaya jika:

  • Bulk update berjalan bersamaan dengan query OLTP

Transaction Log & Replication Lag #

Bulk CUD menghasilkan:

  • Log besar
  • Replication lag (read replica tertinggal)

Ini sering terlihat sebagai:

  • Primary sehat
  • Read replica lambat atau timeout

ampak Bulk CUD ke Query Planner #

Bulk CUD dapat menyebabkan:

  • Statistik table menjadi usang
  • Planner memilih execution plan yang salah

Contoh:

  • Setelah delete besar-besaran
  • Table menyusut tapi statistik belum update

Akibatnya:

Query kecil → Full Table Scan

Solusi biasanya:

ANALYZE;
VACUUM;

Best Practice Bulk CUD Operation #

Gunakan Batch Size yang Masuk Akal #

❌ Jangan:

  • 1 transaksi = 1 juta row

✅ Lakukan:

  • Chunking / batching

Contoh:

  • 1.000 – 10.000 row per batch

Keuntungan:

  • Lock lebih singkat
  • Lebih ramah concurrency

Minimize Index Saat Bulk Write #

Untuk operasi masif:

  • Drop index non-kritis sementara
  • Rebuild setelah selesai

⚠️ Hanya untuk:

  • Proses offline
  • Maintenance window

Gunakan INSERT … SELECT atau COPY #

Lebih efisien daripada loop aplikasi:

INSERT INTO archive_orders
SELECT * FROM orders WHERE created_at < now() - interval '1 year';

Atau (Postgres):

COPY table FROM STDIN;

Hindari Update Kolom yang Tidak Perlu #

Setiap update:

  • Membuat row version baru
  • Mengupdate index

❌ Jangan:

UPDATE users SET name = name;

✅ Update hanya kolom yang berubah.

Gunakan Idempotent Bulk CUD #

Untuk retry-safe:

INSERT INTO users (id, email)
VALUES (1, '[email protected]')
ON CONFLICT (id) DO NOTHING;

Penting untuk:

  • Worker async
  • Job retry

Jalankan Bulk CUD di Jam Sepi #

Idealnya:

  • Di luar jam peak
  • Dengan throttling

Bulk job ≠ OLTP workload.

Monitor dan Observability #

Pantau:

  • Lock wait time
  • Rows affected
  • Transaction duration
  • Replication lag

Bulk CUD tanpa observability = bom waktu.


Anti-Pattern yang Sering Terjadi #

❌ Loop aplikasi:

for _, row := range rows {
    db.Exec("UPDATE ...")
}

❌ Satu transaksi super besar

❌ Bulk update tanpa WHERE selektif

❌ Bulk delete tanpa archive


Kesimpulan #

Bulk CUD Operation adalah:

  • Sangat powerful
  • Sangat berbahaya jika salah desain

Intinya:

  • Bulk CUD bukan soal SQL syntax
  • Tapi soal database internals, concurrency, dan workload separation

Jika dilakukan dengan benar:

  • Throughput naik
  • Cost turun
  • Sistem lebih stabil

Jika salah:

  • Lock panjang
  • Query lambat
  • Insiden produksi

Bulk CUD adalah pisau tajam — efisien di tangan yang tepat, mematikan jika asal pakai.

About | Author | Content Scope | Editorial Policy | Privacy Policy | Disclaimer | Contact