Ada (sekarang) berpotensi dua cara untuk mencapai kompresi khusus:
Mulai di SQL Server 2016 ada fungsi built-in untuk COMPRESS dan DECOMPRESS . Fungsi-fungsi ini menggunakan algoritma GZip.
Gunakan SQLCLR untuk mengimplementasikan algoritma apa pun yang Anda pilih (seperti @Remus disebutkan dalam jawabannya). Opsi ini tersedia dalam versi sebelum SQL Server 2016, kembali ke SQL Server 2005.
GZip adalah pilihan yang mudah karena tersedia di dalam .NET dan di pustaka .NET Framework yang didukung (kode dapat berada dalam SAFE
Majelis). Atau, jika Anda ingin GZip tetapi tidak ingin berurusan dengan pengkodean / penggelarannya, Anda dapat menggunakan fungsi Util_GZip dan Util_GUnzip yang tersedia dalam versi gratis dari perpustakaan SQL # SQLCLR (yang saya penulis).
Jika Anda memutuskan untuk menggunakan GZip, apakah Anda mengkodekannya sendiri atau menggunakan SQL #, perlu diketahui bahwa algoritma yang digunakan dalam .NET untuk melakukan kompresi GZip berubah dalam Framework versi 4.5 menjadi lebih baik (lihat bagian "Keterangan" pada MSDN halaman untuk Kelas GZipStream ). Ini berarti:
- Jika Anda menggunakan SQL Server 2005, 2008, atau 2008 R2 - semua ditautkan ke CLR v 2.0 yang menangani versi Kerangka 2.0, 3.0, dan 3.5 - maka perubahan yang dibuat dalam Kerangka versi 4.5 tidak berpengaruh dan Anda sayangnya terjebak dengan .NET asli, algoritma sial.
- Jika Anda menggunakan SQL Server 2012 atau yang lebih baru (sejauh 2014 dan 2016) - semua terkait dengan CLR v 4.0 yang menangani versi Kerangka 4.0, 4.5.x, 4.6 - maka Anda dapat menggunakan algoritma yang lebih baru dan lebih baik. Satu-satunya persyaratan adalah Anda telah memperbarui .NET Framework di server yang menjalankan SQL Server menjadi versi 4.5 atau lebih baru.
Namun, Anda tidak harus menggunakan GZip dan bebas menerapkan algoritma apa pun seperti.
TOLONG DICATAT: semua metode yang disebutkan di atas lebih dari sekadar "mengatasi" alih-alih menjadi pengganti yang sebenarnya, meskipun secara teknis "cara alternatif untuk mengompresi data NVARCHAR (MAX)". Perbedaannya adalah bahwa dengan Kompresi Data bawaan - row
dan page
- yang ditawarkan oleh SQL Server, kompresi ditangani di belakang layar dan data masih dapat digunakan, dibaca, dan diindeks. Tetapi mengompresi data apa pun menjadi VARBINARY
sarana Anda menghemat ruang, tetapi melepaskan beberapa fungsi. Benar, string 20k tidak dapat diindeks, tetapi masih dapat digunakan dalamWHERE
klausa, atau dengan fungsi string apa pun. Untuk melakukan apa pun dengan nilai terkompresi khusus, Anda harus mendekompresnya dengan cepat. Saat mengompresi file biner (PDF, JPEG, dll.) Ini bukan masalah, tetapi pertanyaan ini khusus untuk NVARCHAR
data.