Saya mencoba mengompres beberapa tabel yang memiliki NVARCHAR(MAX)
bidang. Sayangnya, row
dan page
kompresi tidak memiliki dampak keinginan (hanya ~ 100/200 MB disimpan untuk tabel 20 GB). Selain itu, saya tidak dapat menerapkan kompresi penyimpanan kolom dan penyimpanan kolom karena tidak mendukung kompresi NVARCHAR(MAX)
bidang.
Adakah yang tahu kalau saya punya alternatif di sini?
Saya juga menebak row
dan page
kompresi tidak memiliki efek karena konten NVARCHAR(MAX)
kolomnya unik.
VARCHAR
berpotensi menyebabkan kehilangan data jika karakter dari lebih dari 1 Halaman Kode digunakan? Saya akan berpikir saran harus dikonversi keNVARCHAR(4000)
jika panjang maks tidak lebih besar dari 4000 karena semua nilai akan memenuhi syarat untuk Kompresi Unicode penuh. Namun, mungkin aman untuk mengasumsikan dari info dalam Pertanyaan bahwa nilainya lebih dari 4000 karakter, itulah sebabnya mereka saat ini tidak dikompres.Jawaban:
Kompresi halaman dan baris tidak mengkompres BLOB .
Jika Anda ingin mengompresi BLOB, Anda perlu menyimpannya
VARBINARY(MAX)
dan menerapkan algoritma kompresi aliran pilihan Anda. Sebagai contohGZipStream
. Ada banyak contoh cara melakukan ini, cukup cari GZipStream dan SQLCLR.sumber
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:
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
danpage
- yang ditawarkan oleh SQL Server, kompresi ditangani di belakang layar dan data masih dapat digunakan, dibaca, dan diindeks. Tetapi mengompresi data apa pun menjadiVARBINARY
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 untukNVARCHAR
data.sumber