Udostępnij za pośrednictwem


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:

  • 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 i 10 sekund.Kompresja używa trzecim przed EJ.Wyniki w niewielkim oszczędności.

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

  • Dokładność = 3.Bajtów = 4.Ponieważ pierwsze 3 bajtów są podejmowane przez 5 AM, uzyskuje się niewiele oszczędności.

  • Dokładność = 4.Bajtów = 4.Pierwsze 3 bajtów są podejmowane w pierwszych sekund 27.Oczekiwano nie oszczędności.

  • Dokładność = 5 bajtów = 5.Piąty bajt będzie używany po 12 w południe.

  • Dokładność = 6 i 7 bajtów = 5.Uzyskuje nie oszczędności.

  • Dokładność = 8 bajtów = 6.Bajt szóstego będzie używany po 3 AM.

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.

UwagaUwaga:
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.