Row Compression Implementation
W tym temacie zestawiono jak Database Engine implementuje kompresji wierszy. Podsumowanie to zawiera podstawowe informacje, aby ułatwić planowanie miejsca, potrzebnych danych.
Włączanie kompresji zmienia tylko format magazyn fizyczny dane, które są skojarzone z danych typu, ale nie jego składni lub semantyka.Zmian w aplikacji nie są wymagane, po włączeniu kompresji w jednej lub kilku tabel.Nowy format przechowywania rekordu ma główne następujące zmiany:
To zmniejsza obciążenie metadane, które jest skojarzone z rekordem.Te metadane to informacje na temat kolumn, ich długości i przesunięcia.W niektórych przypadkach może być większy niż w przypadku starego formatu magazynu obciążenie metadane.
Używa formatu magazynu o zmiennej długości dla typów numerycznych (na przykład integer, decimal, a float) i typy, które są oparte na liczbowy (na przykład datetime i money).
Ciągi znaków stałych przechowuje przy użyciu formatu o zmiennej długości, przechowując nie puste znaki.
Uwaga
Wartości NULL i wartości 0 dla wszystkich typów danych są zoptymalizowane i podejmowania nie bajtów.
Wpływ magazynu kompresji wierszy
W poniższej tabela opisano, jak kompresji wiersza wpływa na istniejące typy w SQL Server. W tabela nie ma oszczędności, które można osiągnąć za pomocą kompresji strona.
Typ danych |
Czy dotyczy magazynu? |
Description |
---|---|---|
tinyint |
Nie |
1 bajt jest minimalna pamięci masowej, potrzebne. |
smallint |
Tak |
Jeśli wartość mieści się w 1 bajt, będą używane tylko 1 bajt. |
int |
Tak |
Używa tylko bajtów, które są potrzebne.Na przykład jeśli wartości mogą być przechowywane w 1 bajt, przechowywania zajmie tylko 1 bajt. |
bigint |
Tak |
Używa tylko bajtów, które są potrzebne.Na przykład jeśli wartości mogą być przechowywane w 1 bajt, przechowywania zajmie tylko 1 bajt. |
decimal |
Tak |
Ten magazyn jest dokładnie taka sama, jak format przechowywania vardecimal.Aby uzyskać więcej informacji zobaczPrzechowywanie danych dziesiętny jako zmienna długość. |
numeric |
Tak |
Ten magazyn jest dokładnie taka sama, jak format przechowywania vardecimal.Aby uzyskać więcej informacji zobaczPrzechowywanie danych dziesiętny jako zmienna długość. |
bit |
Tak |
Obciążenie metadane przesuwa to 4 bity. |
smallmoney |
Tak |
Używa całkowitą reprezentacji danych przy użyciu całkowitą 4-bajtowego.Wartość waluty jest mnożona przez 10 000 i wynikową wartość całkowitą, jest przechowywany przez usunięcie wszystkich cyfr po przecinku.Tego typu ma optymalizacji pamięci masowej, podobnie jak dla typu integer. |
money |
Tak |
Używa całkowitą reprezentacji danych za pomocą 8-bajtowe liczby całkowitej.Wartość waluty jest mnożona przez 10 000 i wynikową wartość całkowitą, jest przechowywany przez usunięcie wszystkich cyfr po przecinku.Tego typu ma zakres większe niż smallmoney. Tego typu ma optymalizacji pamięci masowej, podobnie jak dla typu integer. |
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 |
Używa całkowitą reprezentacji danych przy użyciu dwie 2-bajtowe liczby całkowite.Data ma 2 bajty.Jest liczbą dni od 1/1/1901.Wymaga to 2 bajtów, począwszy od 1902.Dlatego istnieje nie oszczędności po, wskazać polecenie. Czas jest liczba minut od północy.Wartości czas, które są nieznacznie poza 4 AM zacząć używać drugi bajt. Jeśli smalldatetime jest używane jedynie w celu reprezentować data (typowych sytuacji) czas jest 0. 0. Kompresja zapisuje 2 bajty, przechowując czas w formacie najbardziej znaczący bajt na potrzeby kompresji wierszy. |
datetime |
Tak |
Używa całkowitą reprezentacji danych przy użyciu dwie 4-bajtowe liczby całkowite.Wartość całkowita reprezentuje liczbę dni z podstawowego dnia 1/1/1900.Do roku 2079 może reprezentować pierwszego 2 bajtów.Kompresja zawsze można zapisać 2 bajtów w tym miejscu, do czasu, punktu.Każda wartość całkowita reprezentuje 3.33 milisekund.Kompresja wyczerpuje pierwszego 2 bajty w pierwszych pięciu minut i wymaga jako czwarty bajt po 16.Dlatego kompresji można zapisać tylko 1 bajt po 16.Kiedy datetime jest kompresowany tak jak wszystkie inne całkowitą, zapisuje kompresji 2 bajty data. |
date |
Nie |
Używa całkowitą reprezentacji danych przy użyciu 3 bajtów.Ten parametr reprezentuje data od 1/1/0001.Współczesny dat wiersz kompresji używane są wszystkie bajty 3.Zapewnia to nie oszczędności. |
time |
Nie |
Używa całkowitą reprezentacji danych przy użyciu 3 do 6 bajtów.Istnieją różne precisions zaczynające się od 0 do 9, może przyjąć 3 do 6 bajtów.Skompresowane miejsce jest używane w następujący sposób:
Nie ma zmian w magazynie dla kompresji wierszy.Ogólnie nie dużo oszczędności można oczekiwać od kompresji time Typ danych. |
datetime2 |
Tak |
Używa całkowitą reprezentacji danych przy użyciu 6 do 9 bajtów.Pierwsze 4 bajty przedstawiają data.Bajty przez czas będzie zależeć od dokładności czasu, który został określony. Wartość całkowita reprezentuje liczbę dni od 1/1/0001 górną granicę 12/31/9999.Aby przedstawić 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 precisions czasu.W związku z tym do precyzyjnego w czasie jednej sekundy, kompresji używane 2 bajty na czas, który ma drugi bajt po sekundach 255. |
datetimeoffset |
Tak |
Podobne do datetime2, z tą różnicą, że nie ma 2 bajty czas strefy format (gg: mm). Podobnie jak datetime2, kompresja może zapisywać 2 bajtów. W przypadku wartości strefy czasowej wartość MM może być 0 w większości przypadków.W związku z tym kompresji, prawdopodobnie można zapisać 1 bajt. W magazynie dla kompresji wiersz nie ma zmian. |
char |
Tak |
Końcowe znaki uzupełnienie są usuwane.Należy zauważyć, że Database Engine Wstawia ten sam znak uzupełnienie niezależnie od sortowanie, który jest używany. |
varchar |
Nie |
Nie działa. |
text |
Nie |
Nie działa. |
nchar |
Tak |
Końcowe znaki uzupełnienie są usuwane.Należy zauważyć, że Database Engine Wstawia ten sam znak uzupełnienie niezależnie od sortowanie, który jest używany. |
nvarchar |
Nie |
Nie działa. |
ntext |
Nie |
Nie działa. |
binary |
Tak |
Końcowe zera zostaną usunięte. |
varbinary |
Nie |
Nie działa. |
image |
Nie |
Nie działa. |
cursor |
Nie |
Nie działa. |
timestamp / rowversion |
Tak |
Używa całkowitą reprezentacji danych przy użyciu 8 bajtów.Brak licznika sygnatur czasowych, który jest obsługiwana dla każdej bazy danych, a jego wartość zaczyna się od 0.Mogą być skompresowane podobnie jak każda inna wartość liczby całkowitej. |
sql_variant |
Nie |
Nie działa. |
uniqueidentifier |
Nie |
Nie działa. |
table |
Nie |
Nie działa. |
xml |
Nie |
Nie działa. |
W przypadku typów zdefiniowanych przez użytkownika |
Nie |
Jest reprezentowane wewnętrznie jako varbinary. |
FILESTREAM |
Nie |
Jest reprezentowane wewnętrznie jako varbinary. |