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):
Tidak error.
Tidak warning.
Tapi setiap jam tertentu, performa database turun.
Setelah Dicek Lebih Dalam…
Ternyata di dalam procedure ada loop seperti ini:
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:
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:
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:
-
Ada UPDATE / INSERT di dalam loop?
-
Bisa dijadikan satu statement SQL?
-
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 👋
