Pernah ngalamin ini?
-
Query dijalankan langsung → cepat
-
Query yang sama dimasukin ke procedure → kok lama?
Awalnya saya juga mikir:
“Ah, mungkin database lagi sibuk.”
Ternyata… sering kali bukan itu masalahnya.
Kasus Nyata yang Sering Terjadi
Query ini kalau dijalankan langsung:
Hasilnya cepat.
Tapi begitu dimasukkan ke procedure:
Dipanggil… dan terasa lambat.
Penyebab #1: Loop Baris per Baris (Row by Row)
Ini jebakan klasik PL/SQL.
Query SQL:
-
Diproses set-based
-
Dioptimasi oleh Oracle
Loop PL/SQL:
-
Diproses baris per baris
-
Jauh lebih berat kalau datanya banyak
Di dunia PL/SQL, ini sering disebut:
“Slow by Slow”
Penyebab #2: Terlalu Banyak Logic di Dalam Loop
Kadang tanpa sadar, di dalam loop kita taruh:
-
SELECT tambahan
-
IF bertingkat
-
UPDATE per baris
Contoh jebakan:
Kalau cursor berisi 10.000 baris, berarti:
👉 10.000 SELECT tambahan
Penyebab #3: Cursor Padahal Bisa SQL Murni
Banyak logic yang sebenarnya bisa ditarik ke SQL langsung.
Daripada:
-
Cursor
-
Loop
-
Logic manual
Sering kali cukup:
Lebih singkat.
Lebih cepat.
Lebih ramah performa.
Catatan Pengalaman Kerja
Di satu project lama, ada procedure yang:
-
Jalan 20 menit
-
Server kelihatan “sibuk”
Setelah dicek:
-
Ada loop
-
Di dalamnya ada SELECT
-
Di dalam SELECT ada function PL/SQL lain
Setelah diubah ke SQL murni:
👉 Waktu turun jadi kurang dari 1 menit
Dan lucunya, logic-nya jadi lebih pendek.
Prinsip yang Selalu Saya Pegang
Kalau kerja pakai PL/SQL, saya selalu tanya ke diri sendiri:
-
Ini bisa pakai SQL saja nggak?
-
Ini perlu loop atau cuma kebiasaan lama?
-
Ada SELECT di dalam loop?
Kalau jawabannya “iya”, biasanya di situ sumber lambatnya.
Penutup
PL/SQL itu kuat, tapi bukan berarti semua masalah harus diselesaikan dengan loop.
Kadang:
-
Kurang kode
-
Lebih SQL
justru hasilnya lebih baik.
Catatan berikutnya kemungkinan bahas:
-
BULK COLLECT & FORALL (versi santai, bukan textbook)
-
Atau debugging procedure yang “diam tapi makan resource”
Sampai catatan Rabu berikutnya 👋

0 comments:
Post a Comment