Bagikan melalui


Eksekusi yang Disiapkan

Berlaku untuk: SQL Server Azure SQL Database Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System (PDW)

ODBC API mendefinisikan eksekusi yang disiapkan sebagai cara untuk mengurangi penguraian dan kompilasi overhead yang terkait dengan berulang kali menjalankan pernyataan Transact-SQL. Aplikasi ini membangun string karakter yang berisi pernyataan SQL dan kemudian menjalankannya dalam dua tahap. Ini memanggil Fungsi SQLPrepare sekali untuk mengurai pernyataan dan dikompilasi ke dalam rencana eksekusi oleh Mesin Database. Kemudian memanggil SQLExecute untuk setiap eksekusi rencana eksekusi yang disiapkan. Ini menghemat penguraian dan kompilasi overhead pada setiap eksekusi. Eksekusi yang disiapkan biasanya digunakan oleh aplikasi untuk berulang kali menjalankan pernyataan SQL yang sama dan berparameter.

Untuk sebagian besar database, eksekusi yang disiapkan lebih cepat daripada eksekusi langsung untuk pernyataan yang dijalankan lebih dari tiga atau empat kali terutama karena pernyataan dikompilasi hanya sekali, sementara pernyataan yang dijalankan secara langsung dikompilasi setiap kali dijalankan. Eksekusi yang disiapkan juga dapat memberikan pengurangan lalu lintas jaringan karena driver dapat mengirim pengidentifikasi rencana eksekusi dan nilai parameter, daripada seluruh pernyataan SQL, ke sumber data setiap kali pernyataan dijalankan.

SQL Server mengurangi perbedaan performa antara eksekusi langsung dan siap melalui algoritma yang ditingkatkan untuk mendeteksi dan menggunakan kembali rencana eksekusi dari SQLExecDirect. Hal ini membuat beberapa manfaat performa dari eksekusi yang disiapkan tersedia untuk pernyataan yang dijalankan secara langsung. Untuk informasi selengkapnya, lihat Eksekusi Langsung.

SQL Server juga menyediakan dukungan asli untuk eksekusi yang disiapkan. Rencana eksekusi dibangun di SQLPrepare dan kemudian dijalankan ketika SQLExecute dipanggil. Karena SQL Server tidak diperlukan untuk membangun prosedur tersimpan sementara pada SQLPrepare, tidak ada overhead tambahan pada tabel sistem dalam tempdb.

Untuk alasan performa, persiapan pernyataan ditangguhkan sampai SQLExecute dipanggil atau operasi metaproperti (seperti SQLDescribeCol atau SQLDescribeParam di ODBC) dilakukan. Ini adalah perilaku default. Setiap kesalahan dalam pernyataan yang disiapkan tidak diketahui sampai pernyataan dijalankan atau operasi metaproperti dilakukan. Mengatur atribut pernyataan khusus driver ODBC SQL Server Native Client SQL_SOPT_SS_DEFER_PREPARE ke SQL_DP_OFF dapat menonaktifkan perilaku default ini.

Dalam hal persiapan yang ditangguhkan, memanggil SQLDescribeCol atau SQLDescribeParam sebelum memanggil SQLExecute menghasilkan perjalanan pulang pergi tambahan ke server. Pada SQLDescribeCol, driver menghapus klausa WHERE dari kueri dan mengirimkannya ke server dengan SET FMTONLY ON untuk mendapatkan deskripsi kolom dalam tataan hasil pertama yang dikembalikan oleh kueri. Pada SQLDescribeParam, driver memanggil server untuk mendapatkan deskripsi ekspresi atau kolom yang direferensikan oleh penanda parameter apa pun dalam kueri. Metode ini juga memiliki beberapa batasan, seperti tidak dapat menyelesaikan parameter dalam subkueri.

Kelebihan penggunaan SQLPrepare dengan driver ODBC SQL Server Native Client menurunkan performa, terutama ketika terhubung ke versi SQL Server sebelumnya. Eksekusi yang disiapkan tidak boleh digunakan untuk pernyataan yang dijalankan satu kali. Eksekusi yang disiapkan lebih lambat daripada eksekusi langsung untuk satu eksekusi pernyataan karena memerlukan pulang-pergi jaringan tambahan dari klien ke server. Pada versi SQL Server yang lebih lama, SQL Server juga menghasilkan prosedur tersimpan sementara.

Pernyataan yang disiapkan tidak dapat digunakan untuk membuat objek sementara di SQL Server.

Beberapa aplikasi ODBC awal menggunakan SQLPrepare kapan saja SQLBindParameter digunakan. SQLBindParameter tidak memerlukan penggunaan SQLPrepare, SQLExecDirect dapat digunakan dengan SQLExecDirect. Misalnya, gunakan SQLExecDirect dengan SQLBindParameter untuk mengambil kode pengembalian atau parameter output dari prosedur tersimpan yang hanya dijalankan satu kali. Jangan gunakan SQLPrepare dengan SQLBindParameter kecuali pernyataan yang sama akan dijalankan beberapa kali.

Lihat Juga

Pernyataan Eksekusi (ODBC)