Sdílet prostřednictvím


Implementace komprese řádků

Platí pro:SQL ServerAzure SQL DatabaseSpravovaná instance Azure SQLDatabáze SQL v Microsoft Fabric

Tento článek shrnuje, jak databázový stroj implementuje kompresi řádků. Tento souhrn obsahuje základní informace, které vám pomůžou naplánovat prostor úložiště, který potřebujete pro vaše data.

Povolení komprese změní pouze formát fyzického úložiště dat přidružených k datovému typu, ale ne jeho syntaxi nebo sémantiku. Změny aplikace se nevyžadují, pokud je povolená komprese jedné nebo více tabulek. Nový formát úložiště záznamů má následující hlavní změny:

  • Snižuje režii na metadata přidruženou k záznamu. Tato metadata jsou informace o sloupcích, jejich délkách a posunech. V některých případech můžou být režijní náklady na metadata větší než starý formát úložiště.

  • Používá formát úložiště s proměnnou délkou pro číselné typy (například celé číslo, desetinné číslo a float) a typy založené na číselném formátu (například datetime a money).

  • Ukládá pevné řetězce znaků pomocí formátu proměnné délky tak, že neukládá prázdné znaky.

Poznámka:

NULL a 0 hodnoty napříč všemi datovými typy jsou optimalizované a nepřebírají žádné bajty.

Vliv komprese řádků na úložiště

Následující tabulka popisuje, jak komprese řádků ovlivňuje existující typy v SQL Serveru a Azure SQL Database. Tabulka nezahrnuje úspory, které lze dosáhnout pomocí komprese stránky.

Datový typ Týká se úložiště? Description
tinyint Ne Minimální potřebná velikost úložiště je 1 bajt.
smallint Ano Pokud se hodnota vejde do 1 bajtu, použije se pouze 1 bajt.
int Ano Používá pouze potřebné bajty. Pokud je například možné hodnotu uložit do 1 bajtu, úložiště přijímá pouze 1 bajt.
bigint Ano Používá pouze potřebné bajty. Pokud je například možné hodnotu uložit do 1 bajtu, úložiště přijímá pouze 1 bajt.
decimal Ano Použije pouze potřebné bajty bez ohledu na zadanou přesnost. Pokud je například možné hodnotu uložit ve 3 bajtech, trvá úložiště pouze 3 bajty. Nároky na úložiště jsou přesně stejné jako formát úložiště vardecimal .
číselný Ano Použije pouze potřebné bajty bez ohledu na zadanou přesnost. Pokud je například možné hodnotu uložit ve 3 bajtech, trvá úložiště pouze 3 bajty. Nároky na úložiště jsou přesně stejné jako formát úložiště vardecimal .
bit Ano Náklady na metadata to zvyšují na 4 bity.
málo peněz Ano Používá celočíselné reprezentace dat při použití 4bajtového celého čísla. Hodnota měny se vynásobí hodnotou 10 000 a výsledná celočíselná hodnota se uloží odebráním libovolných číslic za desetinnou čárkou. Tento typ má optimalizaci úložiště podobnou té pro celočíselné typy.
peníze Ano Používá celočíselnou reprezentaci dat pomocí 8-bytového celého čísla. Hodnota měny se vynásobí hodnotou 10 000 a výsledná celočíselná hodnota se uloží odebráním libovolných číslic za desetinnou čárkou. Tento typ má větší rozsah než smallmoney. Tento typ má optimalizaci úložiště podobnou té pro celočíselné typy.
float Ano Nejméně významné bajty s nulami se neukládají. Komprese float se vztahuje převážně na nefrakcionální hodnoty v mantise.
skutečné Ano Nejméně významné bajty s nulami se neukládají. skutečná komprese je většinou použitelná pro nenefrakcionální hodnoty v mantise.
smalldatetime Ne Používá celočíselnou reprezentaci dat pomocí dvou bajtů celých čísel a je počet dní od 1900-01-01. Pro datovou část smalldatetime neexistuje žádná výhoda komprese řádků.

Doba je počet minut od půlnoci. Časové hodnoty, které jsou lehce po 4:00, začínají používat druhý bajt.

Pokud se smalldatetime používá pouze k reprezentaci data (což je běžné), je 0.0čas. Komprese šetří 2 bajty uložením času v nejvýznamnějším bajtovém formátu pro kompresi řádků.
datetime Ano Používá celočíselnou reprezentaci dat s využitím dvou 4-bytových celých čísel. Celočíselná hodnota představuje počet dnů se základním datem 1900-01-01. Prvních 2 bajtů může představovat až rok 2079. Komprese může vždy ušetřit 2 bajty až do tohoto bodu. Každá celočíselná hodnota představuje 3,33 milisekund. Komprese vyčerpá prvních 2 bajty během prvních pěti minut a potřebuje čtvrtý bajt po 4:00. Komprese tedy může ušetřit pouze 1 bajt po 4:00. Když se data a čas zkomprimuje stejně jako jakékoli jiné celé číslo, komprese uloží do data 2 bajty.
date Ne Používá celočíselnou reprezentaci dat pomocí 3 bajtů. Představuje datum od 0001-01-01. Pro současná data používá komprese řádků všechny 3 bajty. Tím nedojde k žádným úsporám.
time Ne Používá celočíselnou reprezentaci dat pomocí 3 až 6 bajtů. Existují různé formáty přesnosti, které začínají číslicemi od 0 do 9 a mohou zabírat 3 až 6 bajtů. Komprimované místo se používá takto:

Přesnost = 0. Bajty = 3. Každá celočíselná hodnota představuje sekundu. Komprese může vyjádřit čas až do 18:00 pomocí 2 bajtů, což může ušetřit 1 bajt.

Přesnost = 1. Bajty = 3. Každá celočíselná hodnota představuje 1/10 sekund. Komprese používá třetí bajt před 2:00. Výsledkem jsou malé úspory.

Přesnost = 2. Bajty = 3. Podobně jako v předchozím případě není pravděpodobné, že by se dosáhlo úspor.

Přesnost = 3. Bajty = 4. Vzhledem k tomu, že první 3 bajty přijímá 5:00 ráno, tato možnost přináší malé úspory.

Přesnost = 4. Bajty = 4. Prvních 3 bajty jsou odebrány během prvních 27 sekund. Neočekává se žádné úspory.

Přesnost = 5, bajty = 5. Pátý bajt se použije po 12-poledne.

Přesnost = 6 a 7, bajty = 5. Nedosahuje žádných úspor.

Přesnost = 8, Bajty = 6. Šestý bajt se použije po 3:00.

V úložišti nedochází ke změně kvůli kompresi řádků. Z komprimace časového datového typu se celkově nedají očekávat velké úspory.
datetime2 Ano Používá celočíselnou reprezentaci dat pomocí 6 až 9 bajtů. Prvních 4 bajtů představuje datum. Počet bajtů potřebných pro čas závisí na přesnosti určeného času.

Celočíselná hodnota představuje počet dní od 0001-01-01 horní hranice 12.31.9999. Chcete-li vyjádřit datum v roce 2005, komprese přebírá 3 bajty.

Nejsou žádné úspory času, protože umožňuje použití 2 až 4 bajtů pro různé úrovně časové přesnosti. Proto pro přesnost o jednu sekundu používá komprese 2 bajty pro čas, který trvá druhý bajt po 255 sekundách.
datetimeoffset Ano Podobá se datetime2 s tím rozdílem, že formát má 2 bajty časového pásma (HH:mm).

Stejně jako datetime2 může komprese ušetřit 2 bajty.

U hodnot časového pásma mm může být 0 tato hodnota ve většině případů. Komprese tedy může ušetřit 1 bajt.

Komprese řádků neobsahuje žádné změny v úložišti.
znak Ano Odeberou se koncové vyplňovací znaky. Databázový stroj vloží stejný znak odsazení bez ohledu na použitou kolaci.
varchar Ne Žádný efekt.
text Ne Žádný efekt.
nchar Ano 1 Koncové výplňové znaky budou odstraněny. Databázový systém vloží stejný vyplňovací znak bez ohledu na použitou kolaci.
nvarchar Bez 1 Žádný efekt.
ntext Ne Žádný efekt.
binary Ano Koncové nuly se odeberou.
varbinary Ne Žádný efekt.
image Ne Žádný efekt.
kurzoru Ne Žádný efekt.
časová značka / rowversion Ano Používá celočíselnou reprezentaci dat pomocí 8 bajtů. Pro každou databázi je zachován čítač časového razítka a jeho hodnota začíná od 0. To se dá zkomprimovat stejně jako jakákoli jiná celočíselná hodnota.
sql_variant Ne Žádný efekt.
uniqueidentifier Ne Žádný efekt.
table Ne Žádný efekt.
xml Číslo 2 Žádný efekt.
Uživatelem definované typy Ne Toto je interně reprezentováno jako varbinární.
FILESTREAM Ne Toto je interně reprezentováno jako varbinární.

1 Komprese Unicode podporuje datové typy nchar s pevnou délkou a nvarchar . Hodnoty dat uložené mimo řádek nebo ve sloupcích nvarchar(max) nejsou komprimované. Komprese Unicode není podporovaná pro data nvarchar(max), i když jsou uložená v řádku.

Data mimo řádek nejsou komprimována při povolování komprese dat. Například záznam XML, který je větší než 8 060 bajtů, používá stránky mimo řádky, které nejsou komprimované.