ni catatan yang muncul setelah beberapa kali “kecolongan”.
Query kelihatan rapi.
Logic kelihatan bersih.
Tapi performanya… pelan pelan banget.
Dan penyebabnya hampir selalu sama:
function PL/SQL dipanggil di dalam query.
Contoh yang Kelihatannya Aman
Function get_salary_grade kelihatan sederhana.
Dan waktu dites pakai 1–2 data, tidak ada masalah.
Masalahnya baru terasa saat:
-
Datanya ribuan
-
Query dipanggil berkali-kali
-
Atau dipakai di report
Apa yang Sebenarnya Terjadi?
Oracle akan:
-
Mengambil set data
-
Lalu memanggil function untuk setiap baris
Artinya:
-
1.000 baris → 1.000 kali function dipanggil
-
10.000 baris → 10.000 kali function dipanggil
Kalau di dalam function ada:
-
SELECT lain
-
IF bertingkat
-
Logic tambahan
Ya jelas terasa lambat.
Contoh Function yang Jadi Masalah
Secara logika: benar.
Secara performa: berbahaya kalau dipanggil massal.
Alternatif yang Lebih Aman
Daripada function di query, sering kali lebih baik:
-
Pindahkan logic ke SQL langsung
-
Pakai JOIN
Contoh:
Lebih panjang sedikit,
tapi:
-
Lebih jelas
-
Lebih cepat
-
Lebih mudah dianalisis optimizer
Catatan Pengalaman Kerja
Saya pernah nemu report yang:
-
Jalan hampir 15 menit
-
Server kelihatan sibuk
-
Tidak ada error
Setelah dicek:
-
Query utamanya simpel
-
Tapi ada 2 function PL/SQL di SELECT
Begitu logic-nya dipindah ke JOIN:
👉 waktu turun jadi di bawah 1 menit
Dan lucunya, kodenya malah jadi lebih “jujur”.
Kapan Function Masih Boleh Dipakai?
Bukan berarti function itu haram 😄
Masih aman kalau:
-
Dipanggil untuk 1 record
-
Dipakai di logic procedure, bukan query massal
-
Atau benar-benar deterministic & sederhana
Yang bahaya:
👉 function + query + data besar
Penutup
Function PL/SQL itu enak dibaca.
Tapi SQL optimizer tidak peduli kode kita cantik atau tidak.
Kalau performa mulai aneh:
-
Cek dulu
-
Ada function di SELECT atau WHERE nggak?
Sering kali jawabannya: ada.
Sampai catatan Rabu berikutnya 👋

0 comments:
Post a Comment