NVARCHAR (MAX) sıkıştırmanın alternatif yolu?


14

NVARCHAR(MAX)Alanlara sahip bazı tabloları sıkıştırmaya çalışıyorum . Ne yazık ki, rowve pagesıkıştırmanın arzu etkisi yoktur (20 GB tablo için yalnızca ~ 100/200 MB kaydedildi). Ayrıca, NVARCHAR(MAX)alanların sıkıştırılmasını desteklemedikleri için sütun deposu ve sütun deposu arşiv sıkıştırmalarını uygulayamıyorum .

Burada başka alternatifim olup olmadığını söyleyebilir mi?

Ayrıca sütunların içeriği benzersiz olduğundan rowve pagesıkıştırma etkisi yoktur sanırım NVARCHAR(MAX).


2
Sütun değerleri kesinlikle 8000 karakterden daha mı geniş? örneğin dbo.largeTable'DAN MAX SEÇ (CAST (LEN (geniş sütun))) dbo.largeTable Aksi takdirde, bunları normal varchar'a dönüştürebilir ve kümelenmiş sütun deposunu uygulayabilirsiniz.
wBob

@wBob En büyük değer yalnızca 2000 karakter olsa bile, VARCHAR1 Kod Sayfasından daha büyük karakterler kullanılıyorsa, dönüşüm sağlama potansiyel olarak veri kaybına neden olmaz mı? NVARCHAR(4000)Maksimum uzunluk 4000'den büyük değilse tavsiyeye dönüştürmek gerektiğini düşünüyorum çünkü tüm değerler tam Unicode Sıkıştırma için uygun olacaktır. Yine de, Soru'daki bilgilerden, değerlerin 4000 karakterden fazla olduğunu varsaymak muhtemelen güvenlidir, bu yüzden şu anda sıkıştırmıyorlar.
Solomon Rutzky

Yanıtlar:


16

Hem sayfa hem de satır sıkıştırması BLOB'ları sıkıştırmaz .

Boyutları nedeniyle, büyük değerli veri türleri bazen özel amaçlı sayfalarda normal satır verilerinden ayrı olarak saklanır. Ayrı olarak depolanan veriler için veri sıkıştırma kullanılamaz.

BLOB'ları sıkıştırmak istiyorsanız, bunları depolamanız VARBINARY(MAX)ve seçtiğiniz akış sıkıştırma algoritmanızı uygulamanız gerekir. Örneğin GZipStream. Bunun nasıl yapılacağına dair birçok örnek var, sadece GZipStream ve SQLCLR'yi arayın.


10

Özel sıkıştırmayı gerçekleştirmenin potansiyel olarak iki yolu vardır:

  1. SQL Server 2016'dan başlayarak COMPRESS ve DECOMPRESS için yerleşik işlevler vardır . Bu işlevler GZip algoritmasını kullanır.

  2. Seçtiğiniz herhangi bir algoritmayı uygulamak için SQLCLR kullanın (yanıtında @Remus belirtildiği gibi). Bu seçenek, SQL Server 2016'dan önceki sürümlerde kullanılabilir ve SQL Server 2005'e kadar uzanır.

    O .NET içinde mevcuttur çünkü GZip kolay bir seçimdir ve desteklenen .NET Framework kütüphaneleri (kod olabilir de SAFEMeclis). Veya, GZip istiyorsanız ancak kodlama / dağıtma ile uğraşmak istemiyorsanız , SQL # SQLCLR kütüphanesinin Ücretsiz sürümünde bulunan Util_GZip ve Util_GUnzip işlevlerini kullanabilirsiniz (yazarı olduğum).

    İster kendiniz kodlayın ister SQL # kullanın, GZip kullanmaya karar verirseniz, GZip sıkıştırmasını yapmak için .NET'te kullanılan algoritmanın Framework sürüm 4.5'te daha iyisi için değiştiğini unutmayın (MSDN'deki "Açıklamalar" bölümüne bakın. ( GZipStream Class ) için tıklayın. Bu şu anlama gelir:

    1. SQL Server 2005, 2008 veya 2008 R2 kullanıyorsanız (tümü Framework sürüm 2.0, 3.0 ve 3.5'i işleyen CLR v 2.0'a bağlı) kullanıyorsanız, Framework sürüm 4.5'te yapılan değişikliğin hiçbir etkisi yoktur ve maalesef .NET'in orijinal, iğrenç algoritması.
    2. SQL Server 2012 veya daha yenisini (şimdiye kadar 2014 ve 2016) kullanıyorsanız - hepsi 4.0, 4.5.x, 4.6 Framework sürümlerini işleyen CLR v 4.0'a bağlı - o zaman daha yeni, daha iyi algoritmayı kullanabilirsiniz. Tek gereksinim, .NET Server'ı SQL Server çalıştıran sunucudaki sürüm 4.5 veya daha yeni bir sürümle güncelleştirmenizdir.

    Ancak, GZip kullanmak zorunda değilsiniz ve benzeri herhangi bir algoritmayı uygulamakta özgürsünüz.

LÜTFEN DİKKAT: yukarıda belirtilen tüm yöntemler teknik olarak "NVARCHAR (MAX)" verilerini sıkıştırmanın alternatif yolları olsa da, gerçek yerine koymak yerine daha çok "çözüm" dir. Aradaki fark, SQL Server tarafından sunulan yerleşik Veri Sıkıştırma ile rowve pagesıkıştırma, sahne arkasında işleniyor ve verilerin hala kullanılabilir, okunabilir ve dizine eklenebilir olmasıdır. Ancak herhangi bir veriyi VARBINARYyerden tasarruf etmek, ancak bazı işlevlerden vazgeçmek anlamına gelir. Doğru, 20k dize zaten dizine eklenemez, ancak yine de birWHEREyan tümcesi veya herhangi bir dize işlevi ile. Sıkıştırılmış özel bir değere sahip herhangi bir şey yapmak için, onu anında açmanız gerekir. İkili dosyaları (PDF, JPEG, vb.) Sıkıştırırken bu bir sorun değildir, ancak bu soru NVARCHARverilere özgüdür .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.