Articles

kompresja w SQL Server: kompresja i dekompresja

Posted by admin

na Twitterze ostatnio zapytałem:

czy ktoś, kogo znam, używa funkcji COMPRESS i DECOMPRESS w T-SQL?

tym, którzy odpowiedzieli twierdząco, poprosiłem:

co sprawiło, że zdecydowałeś się na to w przeciwieństwie do ROW lub PAGE?

Joey D ’ Antonio (blog | Twitter), jeden z moich współautorów, przypomniał mi, że kompresja wierszy i stron nie działa na danych LOB („large object”). Dave Dustin (Twitter) i Niko Neugebauer (blog | Twitter) powiedzieli, że specjalnie używają COMPRESS dla danych LOB z tego powodu.

zmiany w kodzie

Korzystanie z tych funkcji wymaga zmian w istniejącym kodzie, ponieważ podczas wstawiania danych należy użyć funkcji COMPRESS. Dave i Niko zrobili to ukrywając funkcjonalność wewnątrz widoków.

jeśli nie możesz wprowadzić zmian w kodzie w swoim środowisku, być może będziesz musiał użyć kompresji wierszy i stron lub indeksów columnstore.

Jak to działa?

wydany z SQL Server 2016, COMPRESS wykorzystuje algorytm kompresji gzip open source i może zmniejszyć przestrzeń używaną nawet o 90% w zależności od rodzaju danych. Dane są zapisywane jako typ danych VARBINARY(MAX) :

INSERT INTO dbo.Table1 (Col1, Col2) VALUES ('C0001', COMPRESS('<long string goes here>'));

DECOMPRESS służy do ponownego odczytu danych:

SELECT Col1, DECOMPRESS(Col2) AS Col2 FROM dbo.Table1 WHERE Col1 = 'C0001';

Gdzie mogę go użyć?

jest to świetne rozwiązanie do śledzenia danych LOB, które nie muszą być często wyszukiwane, na przykład dużych ciągów zawierających tekst JSON i XML. Jak wspomniano w poprzednim poście, typ danych XML może nie być odpowiedni do celów audytu, ponieważ trwale modyfikuje dane, podczas gdy COMPRESS byłby odpowiednim mechanizmem przechowywania, ponieważ dane są dokładnie takie same po ponownym odczytaniu.

czy są jakieś ograniczenia?

nie możesz indeksować skompresowanych danych, ponieważ są one przechowywane jako skompresowana tablica bajtów. Jeśli chcesz utworzyć indeks, możesz użyć kompresji wiersza lub strony i mieć nadzieję na najlepsze, lub użyć obliczonej kolumny zawierającej dane potrzebne z kolumny i indeksować ją zamiast tego.

Related Post