Próbuję skompresować niektóre tabele zawierające NVARCHAR(MAX)
pola. Niestety, row
a page
kompresja nie mają wpływu pragnienie (tylko ~ 100/200 MB do 20 GB zapisanej tabeli). Ponadto nie jestem w stanie zastosować kompresji archiwizacji magazynu kolumn i magazynu kolumn, ponieważ nie obsługują one kompresji NVARCHAR(MAX)
pól.
Czy ktoś może powiedzieć, czy mam tutaj jakieś alternatywy?
Ja również odgadnąć row
i page
kompresja nie mają wpływu, ponieważ zawartość NVARCHAR(MAX)
kolumn jest wyjątkowy.
VARCHAR
potencjalną utratę danych, gdyby używane były znaki z więcej niż 1 strony kodowej? Sądzę, że zaleceniem jest konwersja,NVARCHAR(4000)
jeśli maksymalna długość nie jest większa niż 4000, ponieważ wtedy wszystkie wartości kwalifikują się do pełnej kompresji Unicode. Mimo to prawdopodobnie bezpiecznie jest założyć na podstawie informacji zawartych w pytaniu, że wartości mają znacznie ponad 4000 znaków, dlatego obecnie nie kompresują się.Odpowiedzi:
Kompresja stron i wierszy nie kompresuje obiektów BLOB .
Jeśli chcesz kompresować obiekty BLOB, musisz je zapisać jako
VARBINARY(MAX)
i zastosować wybrany algorytm kompresji strumienia. Na przykładGZipStream
. Istnieje wiele przykładów, jak to zrobić, wystarczy wyszukać GZipStream i SQLCLR.źródło
Istnieją (obecnie) potencjalnie dwa sposoby uzyskania niestandardowej kompresji:
Począwszy od SQL Server 2016 są wbudowane funkcje COMPRESS i DECOMPRESS . Funkcje te używają algorytmu GZip.
Użyj SQLCLR, aby zaimplementować dowolny wybrany algorytm (jak wspomniano w odpowiedzi na @Remus). Ta opcja jest dostępna w wersjach wcześniejszych niż SQL Server 2016, począwszy od SQL Server 2005.
GZip jest łatwym wyborem, ponieważ jest dostępny w .NET i obsługiwanych bibliotekach .NET Framework (kod może znajdować się w
SAFE
asemblerze). Lub, jeśli chcesz GZip, ale nie chcesz zajmować się kodowaniem / wdrażaniem go, możesz użyć funkcji Util_GZip i Util_GUnzip, które są dostępne w bezpłatnej wersji biblioteki SQL # SQLCLR (której jestem autorem).Jeśli zdecydujesz się na użycie GZip, bez względu na to, czy kodujesz sam, czy używasz SQL #, pamiętaj, że algorytm użyty w .NET do kompresji GZip został zmieniony w Framework Framework 4.5 na lepsze (zobacz sekcję „Uwagi” na MSDN strona dla klasy GZipStream ). To znaczy:
Jednak nie musisz używać GZip i możesz dowolnie implementować dowolny algorytm.
UWAGA: wszystkie wyżej wymienione metody są bardziej „obejściami” niż rzeczywistymi zamiennikami, mimo że są technicznie „alternatywnymi sposobami kompresji danych NVARCHAR (MAX)”. Różnica polega na tym, że dzięki wbudowanej kompresji danych -
row
ipage
- oferowanej przez SQL Server, kompresja jest obsługiwana za kulisami, a dane są nadal użyteczne, czytelne i indeksowalne. Ale kompresja dowolnych danychVARBINARY
oznacza, że oszczędzasz miejsce, ale rezygnujesz z niektórych funkcji. To prawda, że ciąg 20k i tak nie jest indeksowalny, ale nadal można go użyć wWHERE
klauzula lub dowolne funkcje łańcuchowe. Aby zrobić cokolwiek z niestandardową skompresowaną wartością, musisz ją rozpakować w locie. Podczas kompresji plików binarnych (PDF, JPEG itp.) Nie stanowi to problemu, ale pytanie dotyczyłoNVARCHAR
danych.źródło