Hoeveel grootte “Null”-waarde nodig is in SQL Server

Ik heb een grote tabel met bijvoorbeeld 10 kolommen. 4 van hen blijven meestal nul. Ik heb een query waarbij de null-waarde elke grootte of geen grootte in bytes aanneemt. Ik heb een paar artikelen gelezen waarvan sommigen zeggen:

http: //www.sql-server-citation.com/2009/12/common-mistakes-in-sql-server-part-4.html

Er is een misvatting dat als we de NULL-waarden in een tabel hebben, deze geen opslagruimte in beslag neemt. Het feit is dat een NULL-waarde ruimte in beslag neemt – 2 bytes

SQL: NULL-waarden gebruiken versus standaardwaarden

Een NULL-waarde in databases is een systeemwaarde die één byte aan opslagruimte in beslag neemt en aangeeft dat een waarde niet aanwezig is in tegenstelling tot een spatie of nul of een andere standaardwaarde.

Kun je me alsjeblieft helpen met de maat genomen door de null-waarde.


Antwoord 1, autoriteit 100%

Als het veld een vaste breedte heeft, neemt het opslaan van NULL dezelfde ruimte in als elke andere waarde – de breedte van het veld.

Als het veld een variabele breedte heeft, neemt de NULL-waarde geen ruimte in beslag.

Naast de ruimte die nodig is om een ​​null-waarde op te slaan, is er ook een overhead voor het hebben van een null-kolom. Voor elke rij wordt één bit per null-kolom gebruikt om aan te geven of de waarde voor die kolom null is of niet. Dit geldt ongeacht of de kolom een ​​vaste of variabele lengte heeft.


De reden voor de discrepanties die u hebt waargenomen in informatie uit andere bronnen:

  • Het begin van het eerste artikel is een beetje misleidend. Het artikel heeft het niet over de kosten van het opslaan van een NULL-waarde, maar over de kosten van het vermogenom een ​​NULL op te slaan (d.w.z. de kosten om een ​​kolom nullable te maken). Het is waar dat het wat opslagruimte kost om een ​​kolom nullable te maken, maar als je dat eenmaal hebt gedaan, kost het minder ruimte om een ​​NULL op te slaan dan om een ​​waarde op te slaan (voor kolommen met variabele breedte).

  • De tweede link lijkt een vraag over Microsoft Access te zijn. Ik weet niet hoe Access NULL’s opslaat, maar het zou me niet verbazen als het anders is dan SQL Server.


Antwoord 2, autoriteit 20%

De volgende link beweert dat als de kolom een ​​variabele lengte heeft, bijv. varchar, NULL0 bytes nodig heeft (plus 1 byte wordt gebruikt om te markeren of de waarde NULLof niet):

De bovenstaande link, evenals de onderstaande link, beweren dat voor kolommen met een vaste lengte, dwz char(10)of int, een waarde van NULLneemt de lengte van de kolom in beslag (plus 1 byte om te markeren of het NULLis of niet):

Voorbeelden:

  1. Als u een char(10)instelt op NULL, neemt deze 10 bytes in beslag (op nul gezet)
  2. Een intduurt 4 bytes (ook op nul gezet).
  3. Een varchar(1 million)ingesteld op NULLduurt 0 bytes (+ 2 bytes)

Opmerking: de opslaggrootte van varcharis de lengte van de ingevoerde gegevens + 2 bytes.


Antwoord 3, autoriteit 3%

Van deze link:

Elke rij heeft een null-bitmap voor kolommen
die nulls toestaan. Als de rij daarin
kolom is null dan een beetje in de
bitmap is 1 anders is het 0.

Voor datatypes met variabele grootte is de
werkelijke grootte is 0 bytes.

Voor datatype met een vaste grootte het acctual
grootte is de standaardgrootte van het gegevenstype in
bytes ingesteld op standaardwaarde (0 voor
cijfers, ” voor tekens).


Antwoord 4, autoriteit 3%

Het opslaan van een NULL-waarde neemt geen ruimte in beslag.

“Feit is dat er een NULL-waarde is
ruimte – 2 bytes.”

Dit is een misvatting — dat is 2 bytes per rij, en ik ben er vrij zeker van dat alle rijen die 2 bytes gebruiken, ongeacht of er kolommen zijn die null kunnen bevatten.

Een NULL-waarde in databases is een systeem
waarde die één byte van in beslag neemt
opslag

Dit heeft het over databases in het algemeen, niet specifiek over SQL Server. SQL Server gebruikt geen 1 byte om NULL-waarden op te slaan.


Antwoord 5

Hoewel deze vraag specifiek is gelabeld als SQL Server 2005, aangezien het nu 2021 is, moet erop worden gewezen dat het een “strikvraag” is voor elke versie van SQL Server na 2005.

Dit komt omdat als ROW- of PAGE-compressie wordt gebruikt, ofals de kolom is gedefinieerd als SPARSE, er “geenspatie” in de eigenlijke rij wordt sla een ‘NULL-waarde’ op. Deze zijn toegevoegd in SQL Server 2008.

De implementatie-opmerkingen voor RIJCOMPRESSIE (wat een vereiste is voor PAGINACOMPRESSIE)stelt:

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

Hoewel er nog steeds minimale metadata (4 bits per kolom + (record overhead / kolommen)) per niet-sparse kolom in elke fysieke record is opgeslagen2, is dit strikt genomen niet de waarde en is vereist in alle gevallen3.

SPARSE kolommen met een NULL-waarde nemen geen ruimte in en geen relevante metadata per rij (naarmate het aantal SPARSE kolommen toeneemt), zij het met een afweging voor niet-NULL waarden.

Als zodanig is het moeilijk om ruimte te “tellen” zonder de werkelijke DB-gebruiksstatistieken te analyseren. De gemiddelde bytes per rijvariëren op basis van precieze kolomtypen, instellingen voor het opnieuw opbouwen van tabellen/indexen, werkelijke gegevens en dubbelheden, vulcapaciteit, effectief paginagebruik, fragmentatie, LOB-gebruik, enz. en is vaak een meer nuttige statistiek.

1SQLite gebruikt een vergelijkbare aanpakom effectief vrije NULL-waarden te hebben.

2Een overzicht van de technische lay-out die wordt gebruikt in ROW (en dus PAGE) compressie kan gevonden worden in “SQL Server 2012 Internals: Special Storage”.

Na de 1 of 2 bytes voor het aantal kolommen volgt de CD-array, die voor elke kolom in de tabel 4 bits [metadata] gebruikt om informatie over de lengte van de kolom weer te geven .. 0 (0×0) geeft aan dat de corresponderende kolom NULL is.

3Leuk weetje: met ROW-compressie bestaan ​​bitkolomwaarden volledig in de corresponderende 4-bits metadata.

Other episodes