Implementacja kompresji wiersza
Ten temat zawiera podsumowanie Aparat baz danych implementuje wiersza kompresji.Podsumowanie to zawiera podstawowe informacje, aby ułatwić planowanie miejsca potrzebnego dla danych.
Włączanie kompresji zmienia tylko format magazyn fizyczny dane skojarzone z danymi typu, ale nie jego składni lub semantyka.Po włączeniu kompresji jednej lub kilku tabel zmian aplikacji nie są wymagane.Nowy format przechowywania rekordów ma następujące główne zmiany:
To zmniejsza obciążenie metadane, które jest skojarzone z rekordem.metadane jest informacji o kolumnach, ich długości i przesunięcia.W niektórych przypadkach może być większe niż format starego magazynu narzutów metadane.
Używa formatu magazynu o zmiennej długości dla typów numerycznych (na przykład integer, decimal, i float) i typy, które są oparte na liczbowy (na przykład datetime i money).
Przechowuje on ciągów znaków na stałe przy użyciu formatu o zmiennej długości, nie przechowując puste znaki.
Ostrzeżenie
NULL i wartości 0 dla wszystkich typów danych są zoptymalizowane i podjąć nie bajtów.
Jak kompresja wiersz dotyczy magazynowania
W poniższej tabela opisano, jak kompresja wiersz dotyczy istniejących typów w SQL Server.Tabela nie zawiera oszczędności, które można osiągnąć za pomocą kompresji strona.
Typ danych |
Magazyn dotyczy problem? |
Opis |
---|---|---|
tinyint |
Nie |
1 bajt jest minimalna magazynu potrzebnych. |
smallint |
Tak |
Jeśli wartość mieści się w 1 bajt, będą używane tylko 1 bajt. |
int |
Tak |
Używa bajtów, które są potrzebne.Na przykład jeśli wartość mogą być przechowywane w 1 bajt, Magazyn podjąć tylko 1 bajt. |
bigint |
Tak |
Używa bajtów, które są potrzebne.Na przykład jeśli wartość mogą być przechowywane w 1 bajt, Magazyn podjąć tylko 1 bajt. |
decimal |
Tak |
Ten magazyn jest dokładnie taki sam, jak format magazynu vardecimal.Aby uzyskać więcej informacji, zobacz Przechowywanie danych dziesiętne jako o zmiennej długości. |
numeric |
Tak |
Ten magazyn jest dokładnie taki sam, jak format magazynu vardecimal.Aby uzyskać więcej informacji, zobacz Przechowywanie danych dziesiętne jako o zmiennej długości. |
bit |
Tak |
Obciążenie metadane przesuwa to 4 bity. |
smallmoney |
Tak |
Reprezentacja danych integer używa przy użyciu 4-bajtowa liczba całkowita.Wartość waluty jest mnożona przez 10000 i wynikową wartość całkowitą jest przechowywany, usuwając wszystkie cyfry po przecinku.Tego typu ma optymalizacji magazynu podobne dla typów całkowitych. |
money |
Tak |
Używa całkowitą reprezentacji danych za pomocą 8-bajtowa liczba całkowita.Wartość waluty jest mnożona przez 10000 i wynikową wartość całkowitą jest przechowywany, usuwając wszystkie cyfry po przecinku.Tego typu ma większy zakres niż smallmoney.Tego typu ma optymalizacji magazynu podobne dla typów całkowitych. |
float |
Tak |
Least significant bytes with zeros are not stored.float compression is applicable mostly for nonfractional values in mantissa. |
real |
Tak |
Least significant bytes with zeros are not stored.real compression is applicable mostly for nonfractional values in mantissa. |
smalldatetime |
Nie |
Reprezentacja danych integer używa przy użyciu dwóch 2-bajtowe liczby całkowite.Data ma 2 bajty.Jest liczbą dni od 1/1/1901.Potrzebuje 2 bajtów, począwszy od 1902.Dlatego nie ma żadnych oszczędności później. Czas jest liczba minut od północy.Wartości czasu są nieco poza 4 AM rozpoczęcie używania drugi bajt. Jeśli smalldatetime jest używana tylko do reprezentować data (wspólne przypadek) czas jest liczba 0,0.Kompresja zapisuje 2 bajty, przechowując czas w najbardziej znaczący bajt formatu kompresji wiersza. |
datetime |
Tak |
Reprezentacja danych integer używa przy użyciu dwóch 4-bajtowe liczby całkowite.Wartość całkowita reprezentuje liczbę dni podstawowa data 1/1/1900.Do roku 2079 może reprezentować pierwszych 2 bajtów.Kompresji zawsze można zapisać 2 bajty, dopóki wskazują.Każda wartość całkowita reprezentuje 3.33 milisekund.Kompresja zmagazynowane pierwsze 2 bajty w pierwszych pięciu minut i potrzeb czwarty bajt po 4 PM.Dlatego kompresji można zapisać tylko 1 bajt po 4 PM.Gdy datetime jest skompresowany, tak jak wszelkie inne integer, zapisuje kompresji 2 bajtów na data. |
date |
Nie |
Reprezentacja danych integer używa przy użyciu 3 bajtów.Przedstawia data od 0001-1/1.Współczesny dat kompresji wierszy używa wszystkich 3 bajtów.Uzyskuje nie oszczędności. |
time |
Nie |
Reprezentacja danych integer używa przy użyciu 3 do 6 bajtów.Istnieją różne szczegółowościw opisie rozpoczynających się od 0 do 9, którą może przyjąć 3 do 6 bajtów.Miejsce skompresowanym jest używane w następujący sposób:
Nie ma zmian w magazynie dla wiersza kompresji.Ogólnie nie dużo oszczędności można oczekiwać od kompresji time typu danych. |
datetime2 |
Tak |
Reprezentacja danych integer używa przy użyciu 6 do 9 bajtów.Pierwsze 4 bajty reprezentować data.Bajtów przez czas będzie zależeć od dokładności określony czas. Wartość całkowita reprezentuje liczbę dni od 1/1/0001 górną granicę 12/31/9999.Aby reprezentować data w roku 2005, kompresji zajmuje 3 bajtów. Jest nie oszczędności na czas, ponieważ umożliwia 2 do 4 bajtów dla różnych szczegółowościw opisie czasu.Dlatego dla precyzji w czasie jednej sekundy, kompresji wykorzystuje 2 bajty na czas, który zabiera sekund 255 drugi bajt. |
datetimeoffset |
Tak |
Podobny do datetime2, z wyjątkiem, że istnieją 2 bajty czas strefy format (gg: mm). Podobnie jak datetime2, kompresji można zapisać 2 bajtów. Dla czas wartości strefy, MM, wartość może być 0 dla większości przypadków.Dlatego kompresji, prawdopodobnie można zapisać 1 bajt. W magazynie dla kompresji wiersz nie ma żadnych zmian. |
char |
Tak |
Końcowe znaki uzupełnienie są usuwane.Należy zauważyć, że Aparat baz danych wstawia niezależnie od sortowanie, który jest używany ten sam znak uzupełnienie. |
varchar |
Nie |
Nie działa. |
text |
Nie |
Nie działa. |
nchar |
Tak |
Tekst jest skompresowany za pomocą standardowego schematu kompresji dla algorytmu Unicode (SCSU), jeśli tekst skompresowany rozmiar jest mniejszy niż bieżący rozmiar tekstu. |
nvarchar |
Tak |
Tekst jest skompresowany za pomocą standardowego schematu kompresji dla algorytmu Unicode (SCSU), jeśli tekst skompresowany rozmiar jest mniejszy niż bieżący rozmiar tekstu. ![]()
Kompresja nie jest obsługiwana dla nvarchar(max).
|
ntext |
Nie |
Nie działa. |
binary |
Tak |
Końcowe zera są usuwane. |
varbinary |
Nie |
Nie działa. |
image |
Nie |
Nie działa. |
cursor |
Nie |
Nie działa. |
timestamp / rowversion |
Tak |
Reprezentacja danych integer używa przy użyciu 8 bajtów.Jest obsługiwany dla każdej bazy danych licznika sygnatur czasowych, a jego wartość zaczyna się od 0.Można to skompresowane, podobnie jak inne wartość całkowitą. |
sql_variant |
Nie |
Nie działa. |
uniqueidentifier |
Nie |
Nie działa. |
table |
Nie |
Nie działa. |
xml |
Nie |
Nie działa. |
Typów zdefiniowanych przez użytkownika |
Nie |
Jest reprezentowane wewnętrznie jako varbinary. |
FILESTREAM |
Nie |
Jest reprezentowane wewnętrznie jako varbinary. |