Wednesday, January 21, 2026

 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

SELECT employee_id, get_salary_grade(salary) FROM employees;

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

FUNCTION get_salary_grade(p_salary NUMBER) RETURN VARCHAR2 IS v_grade VARCHAR2(10); BEGIN SELECT grade INTO v_grade FROM salary_grade WHERE p_salary BETWEEN min_salary AND max_salary; RETURN v_grade; END;

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:

SELECT e.employee_id, g.grade FROM employees e JOIN salary_grade g ON e.salary BETWEEN g.min_salary AND g.max_salary;

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

Popular Posts