Membandingkan Ekstensi Bahasa SQL Server dengan SQL CLR
Berlaku untuk: SQL Server 2019 (15.x) dan versi yang lebih baru
Artikel ini membandingkan Ekstensi Bahasa SQL Server dan runtime bahasa umum (CLR) asli. Ini mengidentifikasi perbedaan utama di antara mereka dan membantu Anda memutuskan mana yang akan digunakan.
Ekstensi Bahasa SQL Server adalah fitur SQL Server yang digunakan untuk mengeksekusi kode eksternal. Data relasional dapat digunakan dalam kode eksternal menggunakan kerangka kerja ekstensibilitas.
Runtime bahasa umum asli (CLR) memungkinkan Anda untuk mengimplementasikan beberapa fungsi SQL Server dengan bahasa .NET. CLR menyediakan kode terkelola dengan layanan seperti integrasi lintas bahasa, keamanan akses kode, manajemen masa pakai objek, serta dukungan penelusuran kesalahan dan pembuatan profil.
Bahasa yang tersedia di Ekstensi Bahasa SQL Server bukan pengganti langsung untuk SQL CLR. Kerangka kerja ekstensibilitas dan ekstensi bahasa memperluas area permukaan SQL Server dan menyediakan lingkungan eksekusi untuk runtime yang lebih dekat ke mesin database. Mereka juga menyediakan kerangka kerja sumber terbuka yang dapat digunakan untuk onboarding runtime baru tanpa perubahan mesin. Saat ini area permukaan dibatasi untuk prosedur tersimpan sistem, sp_execute_external_script
.
Berikut ini adalah beberapa perbedaan utama antara Ekstensi Bahasa SQL dan SQL CLR:
Fitur | SQL CLR | Ekstensi Bahasa SQL |
---|---|---|
Dukungan platform | Windows & Linux - Linux hanya SAFE mendukung rakitan. |
Windows & Linux - paritas penuh dalam hal fungsionalitas. |
Mode eksekusi | Dalam proc | Out-of-proc |
Isolasi | Kode CLR dijalankan dalam proses mesin; administrator instans perlu mempercayai semua rakitan/kode. | Eksekusi runtime berada di luar proses mesin. Isolasi lebih lanjut disediakan menggunakan Kontainer Aplikasi di Windows atau Namespace di Linux. Komunikasi jaringan eksternal juga dinonaktifkan secara default. |
Sintaksis deklaratif (T-SQL) | Jenis yang ditentukan pengguna, agregat, fungsi, prosedur, pemicu yang ditentukan pengguna. | Hanya eksekusi ad hoc menggunakan sp_execute_external_script . |
Dukungan DDL | CREATE ASSEMBLY untuk mengunggah kode pengguna dan menentukan objek lain (fungsi, proc, memicu UDT, UDAggs). |
CREATE EXTERNAL LANGUAGE , EXTERNAL LIBRARY untuk mengelola ekstensi dan pustaka. |
Dukungan perpustakaan | Dicapai melalui rakitan. | Pustaka untuk runtime tertentu dapat digunakan (Misalnya: paket R atau Python, pustaka Java). |
Runtime yang didukung | .NET Framework | R, Python, Java, C# atau Bring your own runtime (BYOR). |
Kerangka kerja OSS | N/A - dapat diperluas melalui Rakitan .NET yang ditentukan pengguna. | Ya - ekstensi SDK menyediakan penulisan ekstensi atau integrasi baru dengan runtime tanpa perubahan mesin. |
Integrasi QO | Integrasi tingkat operator untuk berbagai sintaks termasuk paralelisme. | Operator skrip eksternal tunggal untuk mengirim/menerima hasil dan data dari runtime, operator ini mendukung eksekusi mode batch dan paralelisme. |
Tata Kelola Sumber Daya | Tidak ada - beberapa kenop di luar gubernur sumber daya. | Menyediakan EXTERNAL RESOURCE POOL objek sebagai mekanisme terpisah untuk mengatur sumber daya yang digunakan oleh runtime/skrip eksternal, kebijakan dapat ditentukan untuk runtime eksternal selain beban kerja SQL. |
Model izin | Kontrol tingkat instans dengan objek terlingkup db. | Kontrol tingkat instans dengan objek terlingkup db. |
Performa | Kode SQL CLR biasanya mengungguli ekstensibilitas karena sifat eksekusi. | Ideal untuk eksekusi berorientasi batch. |
Kemampuan pemantauan | sys.dm_clr* DMV & penghitung Monitor Performa khusus SQL CLR terbatas. |
sys.dm_external* DMV, DMV kumpulan sumber daya eksternal, penghitung Windows JobObject Performance Monitor. |
Kapan menggunakan masing-masing
Apakah Anda menggunakan Ekstensi Bahasa atau CLR tergantung pada skenario dan tujuan Anda. Misalnya, jika Anda perlu memperluas area permukaan T-SQL dengan agregat atau jenis Anda sendiri, maka CLR adalah pilihan terbaik karena jenis atau agregat tidak dapat didefinisikan menggunakan mekanisme ekstensibilitas. Di sisi lain, jika Anda ingin menggunakan keahlian ilmu data yang ada di organisasi atau tim Anda, maka menggunakan integrasi R/Python dengan ekstensibilitas adalah pilihan terbaik.
Demikian pula, tujuan performa Anda mungkin menentukan keputusan Anda. Menerapkan fungsi regex di C# dan menggunakan CLR jauh lebih cepat daripada menggunakan ekstensibilitas untuk memanggil skrip Python yang melakukan fungsi regex yang sama.