Udostępnij za pośrednictwem


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:

  • Dokładność = 0.Bajtów = 3.Każda wartość całkowita reprezentuje sekundy.Kompresja może reprezentować czas do 6 PM przy użyciu 2 bajty, zapisywanie potencjalnie 1 bajt.

  • Dokładność = 1.Bajtów = 3.Każda wartość całkowita reprezentuje 1/10 sekund.Kompresja przed 2 AM używa trzeciego bajtów.Wyniki w niewielkim oszczędności.

  • Dokładność = 2.Bajtów = 3.Podobnie jak w poprzednim przypadek, jest mało prawdopodobne, aby osiągnąć oszczędności.

  • Dokładność = 3.Bajtów = 4.Ponieważ AM 5 pobierane są pierwsze 3 bajtów, zapewnia oszczędności niewielkie.

  • Dokładność = 4.Bajtów = 4.Pierwsze 3 bajtów są pobierane w pierwszej 27 sekund.Oczekuje się oszczędności nie.

  • Dokładność = 5, liczba bajtów = 5.Piąty bajt będą używane po 12 w południe.

  • Dokładność = 6 i 7, bajty = 5.Uzyskuje nie oszczędności.

  • Dokładność = 8, liczba bajtów = 6.Szósty bajt będą używane po 3 AM.

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.