Traffine I/O

Bahasa Indonesia

2023-03-12

Bind Variable dalam SQL

Apa itu Bind Variables

Bind variable merupakan nilai dalam pernyataan SQL yang dapat berubah setiap kali pernyataan tersebut dijalankan. Bind variable digunakan untuk menggantikan nilai literal dalam pernyataan SQL dan dapat secara signifikan mengoptimalkan kinerja pernyataan SQL yang sering dieksekusi.

Bind variable memainkan peran penting dalam SQL dengan menyediakan pendekatan yang lebih dinamis dalam melakukan query. Mereka memungkinkan penggunaan variabel dalam query SQL, sehingga memudahkan pembuatan query yang dinamis. Hal ini sangat menguntungkan dalam kasus query yang berulang, karena query tidak perlu dianalisis ulang (reparsing) setiap kali dieksekusi.

Manfaat menggunakan bind variable meliputi:

  • Optimisasi performa
    Bind variable dapat membantu mengurangi overhead parsing, sehingga meningkatkan performa.
  • Pencegahan SQL Injection
    Mereka membantu mengurangi serangan SQL injection karena nilai bind variable tidak pernah dianggap sebagai kode yang dapat dieksekusi.
  • Skalabilitas yang meningkat
    Dengan mengurangi overhead parsing, bind variable membantu meningkatkan skalabilitas aplikasi.

Bekerja dengan Bind Variables

Deklarasi bind variable dapat berbeda tergantung pada sistem manajemen database SQL yang Anda gunakan. Dalam MySQL, Anda mendeklarasikan variabel menggunakan perintah SET. Namun, PostgreSQL tidak mendukung variabel sesi dengan cara yang sama.

Dalam MySQL, Anda dapat mendeklarasikan dan menggunakan bind variable dalam pernyataan SQL sebagai berikut:

sql
SET @customer_id=1;
SELECT * FROM customers WHERE id = @customer_id;

Pada contoh ini, @customer_id adalah bind variable. Pertama, kita mendeklarasikan bind variable @customer_id dan memberikan nilainya 1. Kemudian, kita menggunakan bind variable tersebut dalam pernyataan SQL SELECT.

Seperti yang disebutkan sebelumnya, PostgreSQL tidak mendukung variabel sesi seperti yang dilakukan MySQL. Namun, bind variable biasanya digunakan dalam konteks fungsi atau prosedur, di mana mereka didefinisikan sebagai argumen. Berikut ini adalah contoh dasar:

sql
CREATE OR REPLACE FUNCTION get_customer(p_customer_id INT) RETURNS TABLE(id INT, name TEXT) AS $$
BEGIN
   RETURN QUERY SELECT * FROM customers WHERE id = p_customer_id;
END;
$$ LANGUAGE plpgsql;


-- To call this function
SELECT * FROM get_customer(1);

Dalam contoh PostgreSQL ini, p_customer_id adalah parameter yang digunakan sebagai bind variable dalam fungsi get_customer.

Parsing dalam SQL

Parsing adalah tahap dalam eksekusi pernyataan SQL di mana mesin SQL memverifikasi kebenaran sintaksis dan semantik pernyataan tersebut. Hal ini memastikan pernyataan SQL dibentuk dengan benar dan memeriksa keberadaan serta penggunaan yang tepat dari objek database yang dirujuk dalam pernyataan tersebut.

Proses Parsing

Proses parsing adalah bagian integral dari eksekusi pernyataan SQL. Ini terdiri dari beberapa langkah yang memeriksa kevalidan dan mengoptimalkan eksekusi pernyataan SQL.

Berikut ini adalah diagram sederhana yang menggambarkan proses parsing:

Pernyataan SQL Pengguna
         |
         V
-------------------
| Pemeriksaan Sintaks |
-------------------
         |
         V
-------------------
| Pemeriksaan Semantik |
-------------------
         |
         V
-------------------
| Pemeriksaan Shared Pool |
-------------------
         |
         V
Rencana Eksekusi
         |
         V
Eksekusi Pernyataan SQL
  • Pemeriksaan Sintaks
    Tahap pertama dari proses parsing memeriksa apakah pernyataan SQL tersebut secara sintaksis benar. Ini memvalidasi bahwa pernyataan SQL memiliki struktur yang benar, dengan kata kunci, klausa, operator, dan tanda kurung yang tepat, dll.

  • Pemeriksaan Semantik
    Setelah pemeriksaan sintaksis, mesin SQL melakukan pemeriksaan semantik. Ini memastikan bahwa semua objek database yang dirujuk dalam pernyataan SQL (tabel, kolom, dll.) ada dan pengguna memiliki izin yang cukup untuk menjalankan pernyataan tersebut.

  • Pemeriksaan Shared Pool
    Tahap terakhir melibatkan pemeriksaan shared pool atau query cache, dll., untuk menemukan versi pernyataan SQL yang sudah di-parse dan dioptimalkan sebelumnya. Jika rencana eksekusi yang sudah ada ditemukan, maka rencana tersebut akan digunakan kembali, menghasilkan soft parse. Jika tidak ditemukan, mesin SQL akan membuat rencana eksekusi baru, menghasilkan hard parse.

Soft Parse dan Hard Parse dalam SQL

Soft parse dan hard parse adalah dua jenis operasi parsing yang terjadi dalam sebuah database.

Soft parse terjadi ketika mesin SQL memeriksa shared pool dan menemukan representasi pernyataan SQL yang sudah di-parse sebelumnya, sehingga mengeliminasi kebutuhan untuk melakukan hard parse yang menggunakan resource yang intensif.

Di sisi lain, hard parse adalah operasi yang lebih luas. Ini terjadi ketika representasi pernyataan SQL yang sudah di-parse tidak ada di shared pool. Mesin SQL harus melakukan pemeriksaan sintaksis dan semantik serta membuat rencana eksekusi baru, yang menggunakan lebih banyak resource dibandingkan dengan soft parse.

Hard parse adalah operasi yang menggunakan resource secara intensif dan dapat menurunkan kinerja database jika dilakukan secara berlebihan. Secara umum, mengoptimalkan operasi SQL untuk soft parse lebih menguntungkan, karena menggunakan resource yang lebih sedikit dan lebih cepat daripada hard parse.

Peran Bind Variables dalam Soft dan Hard Parse

Bind variable dapat secara signifikan meningkatkan kemungkinan terjadinya soft parse. Ketika pernyataan SQL hanya berbeda dalam nilai literal yang mereka operasikan, penggunaan bind variable memungkinkan pernyataan-pernyataan ini dikenali sebagai identik dalam shared pool, sehingga mesin SQL dapat melakukan soft parse alih-alih hard parse.

Meskipun bind variable dapat membantu menghindari hard parse yang tidak perlu, ada skenario di mana bind variable dapat menghasilkan rencana eksekusi yang kurang optimal selama hard parse. Hal ini umumnya disebut sebagai bind variable peeking. Memahami kapan dan bagaimana menggunakan bind variable dengan benar adalah penting untuk memanfaatkan manfaatnya sambil mengurangi kemungkinan kerugian potensial.

Menggunakan bind variable dengan benar dapat secara signifikan mengoptimalkan kinerja SQL. Dengan mengurangi kebutuhan akan hard parse, bind variable dapat membantu mengurangi penggunaan CPU, mengurangi persaingan untuk struktur memori bersama di SGA, dan meningkatkan skalabilitas aplikasi.

Ryusei Kakujo

researchgatelinkedingithub

Focusing on data science for mobility

Bench Press 100kg!