Performa SQL dinamis di ODBC

Meskipun SQL statis berfungsi dengan baik dalam banyak situasi, ada kelas aplikasi di mana akses data tidak dapat ditentukan terlebih dahulu. Misalnya, misalkan spreadsheet memungkinkan pengguna untuk memasukkan kueri, yang kemudian dikirim spreadsheet ke DBMS untuk mengambil data. Isi kueri ini jelas tidak dapat diketahui oleh programmer ketika program lembar bentang ditulis.

Eksekusi dinamis

Untuk mengatasi masalah ini, spreadsheet menggunakan bentuk SQL tersemat yang disebut SQL dinamis. Tidak seperti pernyataan SQL statis, yang dikodekan secara permanen dalam program, pernyataan SQL dinamis dapat dibangun pada durasi dan ditempatkan dalam variabel host string. Mereka kemudian dikirim ke DBMS untuk diproses. Karena DBMS harus menghasilkan rencana akses pada durasi untuk pernyataan SQL dinamis, SQL dinamis umumnya lebih lambat daripada SQL statis. Ketika program yang berisi pernyataan SQL dinamis dikompilasi, pernyataan SQL dinamis tidak dilucuti dari program, seperti dalam SQL statis. Sebaliknya, mereka digantikan oleh panggilan fungsi yang meneruskan pernyataan ke DBMS; pernyataan SQL statis dalam program yang sama diperlakukan secara normal.

Cara paling sederhana untuk menjalankan pernyataan SQL dinamis adalah dengan pernyataan EXECUTE IMMEDIATE. Pernyataan ini meneruskan pernyataan SQL ke DBMS untuk kompilasi dan eksekusi.

Salah satu kerugian dari pernyataan EXECUTE IMMEDIATE adalah bahwa DBMS harus melalui masing-masing dari lima langkah pemrosesan pernyataan SQL setiap kali pernyataan dijalankan. Overhead yang terlibat dalam proses ini dapat signifikan jika banyak pernyataan dijalankan secara dinamis, dan boros jika pernyataan tersebut serupa.

Eksekusi yang disiapkan

Untuk mengatasi situasi di atas, SQL dinamis menawarkan bentuk eksekusi yang dioptimalkan yang disebut eksekusi yang disiapkan, yang menggunakan langkah-langkah berikut:

  1. Program ini membuat pernyataan SQL dalam buffer, seperti halnya untuk pernyataan EXECUTE IMMEDIATE. Alih-alih variabel host, tanda tanya (?) dapat diganti dengan konstanta di mana saja dalam teks pernyataan untuk menunjukkan bahwa nilai untuk konstanta akan disediakan nanti. Tanda tanya disebut sebagai penanda parameter.

  2. Program ini meneruskan pernyataan SQL ke DBMS dengan pernyataan PREPARE, yang meminta agar DBMS mengurai, memvalidasi, dan mengoptimalkan pernyataan dan menghasilkan rencana eksekusi untuk itu. Program kemudian menggunakan pernyataan EXECUTE (bukan pernyataan EXECUTE IMMEDIATE) untuk menjalankan pernyataan PREPARE di lain waktu. Ini meneruskan nilai parameter untuk pernyataan melalui struktur data khusus yang disebut SQL Data Area atau SQLDA.

  3. Program ini dapat menggunakan pernyataan EXECUTE berulang kali, menyediakan nilai parameter yang berbeda setiap kali pernyataan dinamis dijalankan.

Eksekusi yang disiapkan masih tidak sama dengan SQL statis. Dalam SQL statis, empat langkah pertama pemrosesan pernyataan SQL berlangsung pada waktu kompilasi. Dalam eksekusi yang disiapkan, langkah-langkah ini masih berlangsung pada durasi, tetapi hanya dilakukan sekali. Eksekusi rencana hanya terjadi ketika EXECUTE dipanggil. Perilaku ini membantu menghilangkan beberapa kekurangan performa yang melekat dalam arsitektur SQL dinamis.

Lihat juga

EXECUTE (Transact-SQL)
sp_executesql (SQL Bertransaksi)