Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of mappen te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen om mappen te wijzigen.
Van toepassing op:SQL Server
Azure SQL Database
Azure SQL Managed Instance
SQL-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.