Share via


Implementatie van rijcompressie

Van toepassing op:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceSQL-database in Microsoft Fabric

In dit artikel wordt beschreven hoe database-engine rijcompressie implementeert. Deze samenvatting bevat basisinformatie waarmee u de opslagruimte kunt plannen die u nodig hebt voor uw gegevens.

Het inschakelen van compressie wijzigt alleen de fysieke opslagindeling van de gegevens die zijn gekoppeld aan een gegevenstype, maar niet de syntaxis of semantiek. Toepassingswijzigingen zijn niet vereist wanneer een of meer tabellen zijn ingeschakeld voor compressie. De nieuwe indeling voor recordopslag heeft de volgende belangrijke wijzigingen:

  • Dit vermindert de overhead van metagegevens die aan de record is gekoppeld. Deze metagegevens zijn informatie over kolommen, lengten en verschuivingen. In sommige gevallen kan de overhead van metagegevens groter zijn dan de oude opslagindeling.

  • Er wordt een opslagindeling met variabele lengte gebruikt voor numerieke typen (bijvoorbeeld geheel getal, decimaal en float) en de typen die zijn gebaseerd op numeriek (bijvoorbeeld datum/tijd en geld).

  • Vaste tekenreeksen worden opgeslagen met een variabele-lengteformaat door de lege tekens niet op te slaan.

Opmerking

NULL en 0 waarden voor alle gegevenstypen zijn geoptimaliseerd en nemen geen bytes in beslag.

Hoe rijcompressie van invloed is op opslag

In de volgende tabel wordt beschreven hoe rijcompressie van invloed is op de bestaande typen in SQL Server en Azure SQL Database. De tabel bevat niet de besparingen die kunnen worden bereikt met behulp van paginacompressie.

Gegevenstype Is de opslag beïnvloed? Description
tinyint Nee. 1 byte is de minimale opslagruimte die nodig is.
smallint Yes Als de waarde in 1 byte past, wordt slechts 1 byte gebruikt.
int Yes Gebruikt alleen de bytes die nodig zijn. Als een waarde bijvoorbeeld kan worden opgeslagen in 1 byte, duurt de opslag slechts 1 byte.
bigint Yes Gebruikt alleen de bytes die nodig zijn. Als een waarde bijvoorbeeld kan worden opgeslagen in 1 byte, duurt de opslag slechts 1 byte.
decimal Yes Gebruikt alleen de bytes die nodig zijn, ongeacht de opgegeven precisie. Als een waarde bijvoorbeeld kan worden opgeslagen in 3 bytes, duurt de opslag slechts 3 bytes. De opslagvoetafdruk is precies hetzelfde als de vardecimale opslagindeling.
numeriek Yes Gebruikt alleen de bytes die nodig zijn, ongeacht de opgegeven precisie. Als een waarde bijvoorbeeld kan worden opgeslagen in 3 bytes, duurt de opslag slechts 3 bytes. De opslagvoetafdruk is precies hetzelfde als de vardecimale opslagindeling.
bit Yes De overhead voor metagegevens brengt dit tot 4 bits.
kleingeld Yes Maakt gebruik van de weergave van gehele getallen met behulp van een geheel getal van 4 bytes. Valutawaarde wordt vermenigvuldigd met 10.000 en de resulterende gehele waarde wordt opgeslagen door cijfers na het decimaalteken te verwijderen. Dit type heeft een opslagoptimalisatie die vergelijkbaar is met die voor gehele getallen.
geld Yes Maakt gebruik van de weergave van gehele getallen met behulp van een geheel getal van 8 bytes. Valutawaarde wordt vermenigvuldigd met 10.000 en de resulterende gehele waarde wordt opgeslagen door cijfers na het decimaalteken te verwijderen. Dit type heeft een groter bereik dan smallmoney. Dit type heeft een opslagoptimalisatie die vergelijkbaar is met die voor gehele getallen.
float Yes Minst significante bytes met nullen worden niet opgeslagen. float-compressie is voornamelijk van toepassing op niet-fractionele waarden in mantissa.
echte Yes Minst significante bytes met nullen worden niet opgeslagen. echte compressie is voornamelijk van toepassing op niet-fractionele waarden in mantissa.
smalldatetime Nee. Maakt gebruik van de weergave van gehele getallen met twee bytes en is het aantal dagen sinds 1900-01-01. Er is geen voordeel van rijcompressie voor het datumgedeelte van smalldatetime.

De tijd is het aantal minuten sinds middernacht. Tijdwaarden die iets voorbij 4.00 uur liggen, beginnen de tweede byte te gebruiken.

Als een smalldatetime alleen wordt gebruikt om een datum weer te geven (een veelvoorkomend geval), is 0.0de tijd . Voor rijcompressie bespaart compressie 2 bytes door de tijd op te slaan in het meest significante byteformaat.
datetime Yes Maakt gebruik van de weergave van gehele getallen met behulp van twee 4 byte-gehele getallen. De waarde van het gehele getal vertegenwoordigt het aantal dagen met de basisdatum van 1900-01-01. De eerste 2 bytes kunnen maximaal het jaar 2079vertegenwoordigen. Compressie kan hier altijd 2 bytes opslaan tot dat punt. Elke gehele waarde vertegenwoordigt 3,33 milliseconden. Compressie gebruikt de eerste 2 bytes in de eerste vijf minuten en heeft de vierde byte na 14:00 uur nodig. Daarom kan compressie slechts 1 byte na 14:00 uur opslaan. Wanneer datum/tijd wordt gecomprimeerd zoals elk ander geheel getal, bespaart compressie 2 bytes in de datum.
date Nee. Maakt gebruik van de weergave van gehele getallen met behulp van 3 bytes. Dit vertegenwoordigt de datum van 0001-01-01. Voor hedendaagse datums gebruikt rijcompressie alle 3 bytes. Dit behaalt geen besparingen.
time Nee. Gebruikt de weergave van gehele getallen met behulp van 3 tot 6 bytes. Er zijn verschillende precisies die beginnen met 0 tot 9 die 3 - 6 bytes kunnen duren. Gecomprimeerde ruimte wordt als volgt gebruikt:

Precisie = 0. Bytes = 3. Elke geheel getalwaarde vertegenwoordigt een seconde. Compressie kan tijd tot 16:00 uur vertegenwoordigen met behulp van 2 bytes, waardoor 1 byte mogelijk wordt bespaard.

Precisie = 1. Bytes = 3. Elke geheel getalwaarde vertegenwoordigt 1/10 seconden. Compressie maakt gebruik van de derde byte vóór 2AM. Resulteert in weinig besparingen.

Precisie = 2. Bytes = 3. Net als in het vorige geval is het onwaarschijnlijk dat er besparingen worden gerealiseerd.

Nauwkeurigheid = 3. Bytes = 4. Omdat de eerste 3 bytes door 5AM worden genomen, bereikt deze optie weinig besparingen.

Precisie = 4. Bytes = 4. De eerste 3 bytes worden in de eerste 27 seconden genomen. Er worden geen besparingen verwacht.

Precision = 5, Bytes = 5. De vijfde byte wordt na 12.00 uur gebruikt.

Precision = 6 en 7, Bytes = 5. Behaalt geen besparingen.

Precision = 8, Bytes = 6. De zesde byte wordt na 3:00 uur gebruikt.

Er is geen wijziging in de opslag voor rijcompressie. Over het algemeen kunnen er niet veel besparingen worden verwacht van het comprimeren van het tijdgegevenstype .
datetime2 Yes Maakt gebruik van de weergave van gehele getallen met behulp van 6 - 9 bytes. De eerste 4 bytes vertegenwoordigen de datum. De bytes die de tijd inneemt, zijn afhankelijk van de precisie van de tijd die gespecificeerd is.

De waarde van het gehele getal vertegenwoordigt het aantal dagen sinds 0001-01-01 met een bovengrens van 12-31-9999. Om een datum in het jaar 2005 weer te geven, neemt compressie 3 bytes in beslag.

Er zijn geen besparingen op tijd omdat het 2 - 4 bytes voor verschillende tijdsprecisie toestaat. Daarom gebruikt compressie voor een precisie van één seconde 2 bytes voor tijd, waarbij de tweede byte na 255 seconden wordt gebruikt.
datetimeoffset Yes Lijkt op datum/tijd2, behalve dat er 2 bytes aan tijdzone van de notatie (HH:mm) zijn.

Net als datum/tijd2 kan compressie 2 bytes besparen.

Voor tijdzonewaarden kan de waarde voor de meeste gevallen mm zijn 0. Daarom kan compressie mogelijk 1 byte besparen.

Er zijn geen wijzigingen in de opslag voor rijcompressie.
teken Yes Afsluitende opvullingstekens worden verwijderd. De Database Engine voegt hetzelfde opvullingsteken in, ongeacht de gebruikte sorteervolgorde.
varchar Nee. Geen effect.
tekst Nee. Geen effect.
nchar Ja 1 Afsluitende opvullingstekens worden verwijderd. De Database Engine voegt hetzelfde opvullingsteken in, ongeacht de gebruikte sorteervolgorde.
nvarchar Nee 1 Geen effect.
ntext Nee. Geen effect.
binary Yes Volgnullen worden verwijderd.
varbinary Nee. Geen effect.
image Nee. Geen effect.
cursor Nee. Geen effect.
tijdstempel / rowversion Yes Maakt gebruik van de weergave van gehele getallen met behulp van 8 bytes. Er is een tijdstempelmeteritem dat wordt onderhouden voor elke database en de waarde ervan begint vanaf 0. Dit kan worden gecomprimeerd zoals elke andere gehele waarde.
sql_variant Nee. Geen effect.
uniqueidentifier Nee. Geen effect.
table Nee. Geen effect.
xml Nr . 2 Geen effect.
Door de gebruiker gedefinieerde typen Nee. Dit wordt intern weergegeven als varbinary.
FILESTREAM Nee. Dit wordt intern weergegeven als varbinary.

1 Unicode-compressie ondersteunt de gegevenstypen nchar en nvarchar met vaste lengte. Gegevenswaarden die buiten de rij of in kolommen nvarchar(max) zijn opgeslagen, worden niet gecomprimeerd. Unicode-compressie wordt niet ondersteund voor nvarchar(max) -gegevens, zelfs niet als deze in de rij zijn opgeslagen.

2 Gegevens buiten rij worden niet gecomprimeerd bij het inschakelen van gegevenscompressie. Een XML-record die groter is dan 8060 bytes, maakt bijvoorbeeld gebruik van pagina's buiten rij, die niet zijn gecomprimeerd.