Wednesday, January 28, 2026

 Ini tipe masalah yang paling bikin curiga.

  • Tidak ada error

  • Tidak ada rollback

  • Log kelihatan normal

Tapi:

  • Server terasa berat

  • Session banyak yang aktif

  • User mulai komplain “kok lambat?”

Dan parahnya, procedure-nya kelihatan biasa saja.


Awalnya Saya Juga Mengira “Mungkin Server Lagi Sibuk”

Procedure ini jalan otomatis (job):

BEGIN process_daily_data; END;

Tidak error.
Tidak warning.
Tapi setiap jam tertentu, performa database turun.


Setelah Dicek Lebih Dalam…

Ternyata di dalam procedure ada loop seperti ini:

FOR rec IN ( SELECT order_id FROM orders WHERE status = 'NEW' ) LOOP UPDATE orders SET status = 'PROCESS' WHERE order_id = rec.order_id; END LOOP;

Sekilas:

  • Aman

  • Jelas

  • Mudah dibaca

Tapi ada masalah besar.


Masalah Utamanya: UPDATE di Dalam Loop

Kalau data:

  • 10 baris → aman

  • 100 baris → masih oke

  • 10.000 baris → mulai terasa

  • 100.000 baris → server bisa “ngap”

Kenapa?

  • Setiap loop = 1 context switch

  • Oracle harus bolak-balik SQL ↔ PL/SQL

Dan ini tidak kelihatan dari sisi error.


Versi yang Lebih Sehat

Kalau logic-nya sederhana seperti ini, loop tidak dibutuhkan.

Cukup:

UPDATE orders SET status = 'PROCESS' WHERE status = 'NEW';

Satu statement.
Lebih cepat.
Lebih ringan.


“Tapi Logic Saya Lebih Rumit…”

Nah, ini biasanya alasan kenapa loop dipertahankan.

Kalau memang perlu proses massal, pertimbangkan:

  • BULK COLLECT

  • FORALL

Contoh singkat:

SELECT order_id BULK COLLECT INTO v_ids FROM orders WHERE status = 'NEW'; FORALL i IN v_ids.FIRST .. v_ids.LAST UPDATE orders SET status = 'PROCESS' WHERE order_id = v_ids(i);

Bukan paling cantik,
tapi jauh lebih ramah performa.


Catatan Pengalaman Kerja

Saya pernah nemu job harian yang:

  • Jalan 40 menit

  • Tidak pernah error

  • Dianggap “wajar”

Setelah diubah:

  • Loop dikurangi

  • UPDATE massal diprioritaskan

Waktu turun jadi kurang dari 5 menit.

Dan tidak ada perubahan logic bisnis sama sekali.


Prinsip Pribadi Saya Sekarang

Setiap lihat PL/SQL, saya selalu cek:

  1. Ada UPDATE / INSERT di dalam loop?

  2. Bisa dijadikan satu statement SQL?

  3. Perlu loop, atau cuma kebiasaan lama?

Kalau ketemu poin 1 + data besar,
biasanya di situlah biang masalahnya.


Penutup

Procedure yang “diam” bukan berarti aman.
Kadang justru dia:

  • Pelan-pelan

  • Konsisten

  • Tapi menggerogoti resource

PL/SQL itu bukan cuma soal benar atau salah,
tapi soal dampaknya ke database.

Sampai catatan Rabu berikutnya 👋

0 comments:

Post a Comment

Popular Posts