De grootte van een niet-geclusterde index schatten
van toepassing op:SQL Server
Azure SQL Database
Azure SQL Managed Instance
SQL-database in Microsoft Fabric
Volg deze stappen om de hoeveelheid ruimte te schatten die nodig is om een niet-geclusterde index op te slaan:
Bereken variabelen voor gebruik in stap 2 en 3.
Bereken de ruimte die wordt gebruikt voor het opslaan van indexinformatie in het bladniveau van de niet-geclusterde index.
Bereken de ruimte die wordt gebruikt om indexinformatie op te slaan in de niet-bladniveaus van de niet-geclusterde index.
Totaal van de berekende waarden.
Stap 1. Variabelen berekenen voor gebruik in stap 2 en 3
U kunt de volgende stappen gebruiken om variabelen te berekenen die worden gebruikt om de hoeveelheid ruimte te schatten die nodig is om de bovenste niveaus van de index op te slaan.
Geef het aantal rijen op dat aanwezig is in de tabel:
Num_Rows = aantal rijen in de tabel
Geef het aantal kolommen met vaste lengte en variabele lengte op in de indexsleutel en bereken de benodigde ruimte voor de opslag:
De belangrijkste kolommen van een index kunnen kolommen met een vaste lengte en variabele lengte bevatten. Als u de grootte van de indexrij van het interieurniveau wilt schatten, berekent u de ruimte die elk van deze groepen kolommen in de indexrij in beslag neemt. De grootte van een kolom is afhankelijk van het gegevenstype en de lengtespecificatie.
Num_Key_Cols = totaal aantal sleutelkolommen (vaste lengte en variabele lengte)
Fixed_Key_Size = totale bytegrootte van alle sleutelkolommen met vaste lengte
Num_Variable_Key_Cols = aantal sleutelkolommen met variabele lengte
Max_Var_Key_Size = maximale bytegrootte van alle sleutelkolommen met variabele lengte
Houd rekening met de gegevensrijzoeker die vereist is als de index niet-uniek is.
Als de niet-geclusterde index niet-uniek is, wordt de gegevensrij-locator gecombineerd met de niet-geclusterde indexsleutel om voor elke rij een unieke sleutel te produceren.
Als de niet-geclusterde index zich boven een heap bevindt, is de gegevensrijzoeker de heap-RID. Dit is een grootte van 8 bytes.
Num_Key_Cols = Num_Key_Cols + 1
Num_Variable_Key_Cols = Num_Variable_Key_Cols + 1
Max_Var_Key_Size = Max_Var_Key_Size + 8
Als de niet-geclusterde index zich boven een geclusterde index bevindt, is de gegevensrijzoeker de clusteringsleutel. De kolommen die moeten worden gecombineerd met de niet-geclusterde indexsleutel, zijn de kolommen in de clustersleutel die nog niet aanwezig zijn in de set niet-geclusterde indexsleutelkolommen.
Num_Key_Cols = Num_Key_Cols + aantal clusteringsleutelkolommen die niet in de set van niet-geclusterde indexsleutelkolommen zitten (+ 1 als de geclusterde index niet-uniek is)
Fixed_Key_Size = Fixed_Key_Size + totale bytegrootte van clusteringsleutelkolommen met vaste lengte, die niet in de set van niet-geclusterde indexsleutelkolommen vallen
Num_Variable_Key_Cols = Num_Variable_Key_Cols + aantal clusteringsleutelkolommen met variabele lengte die niet in de set van niet-geclusterde indexsleutelkolommen zitten (+ 1 als de geclusterde index niet uniek is)
Max_Var_Key_Size = Max_Var_Key_Size + maximale bytegrootte van sleutelkolommen met variabele lengte die niet in de set van niet-geclusterde indexsleutelkolommen zitten (+ 4 als de geclusterde index niet-uniek is)
Een deel van de rij, ook wel de null-bitmap genoemd, kan worden gereserveerd voor het beheren van de nullbaarheid van kolommen. De grootte ervan berekenen:
Als er null-kolommen in de indexsleutel staan, inclusief eventuele benodigde clusteringsleutelkolommen zoals beschreven in stap 1.3, wordt een deel van de indexrij gereserveerd voor de null-bitmap.
Index_Null_Bitmap = 2 + ((aantal kolommen in de indexrij + 7) / 8)
Alleen het gehele getal van de vorige expressie moet worden gebruikt. Verwijder een restgetal.
Als er geen nullable-sleutelkolommen zijn, stelt u Index_Null_Bitmap in op 0.
Bereken de grootte van variabele lengte gegevens:
Als er kolommen met variabele lengte in de indexsleutel staan, inclusief eventuele benodigde geclusterde indexsleutelkolommen, bepaalt u hoeveel ruimte wordt gebruikt om de kolommen in de indexrij op te slaan:
Variable_Key_Size = 2 + (Num_Variable_Key_Cols x 2) + Max_Var_Key_Size
De bytes die zijn toegevoegd aan Max_Var_Key_Size zijn voor het bijhouden van elke variabelekolom. In deze formule wordt ervan uitgegaan dat alle kolommen met variabele lengte 100 procent vol zijn. Als u verwacht dat een kleiner percentage van de kolomopslagruimte met variabele lengte wordt gebruikt, kunt u de Max_Var_Key_Size waarde met dat percentage aanpassen om een nauwkeurigere schatting te maken van de totale tabelgrootte.
Als er geen kolommen met variabele lengte zijn, stelt u Variable_Key_Size in op 0.
De grootte van de indexrij berekenen:
Index_Row_Size = Fixed_Key_Size + Variable_Key_Size + Index_Null_Bitmap + 1 (voor rijkopoverhead van een indexrij) + 6 (voor de aanwijzer voor de onderliggende pagina-id)
Het aantal indexrijen per pagina berekenen (8096 gratis bytes per pagina):
Index_Rows_Per_Page = 8096 / (Index_Row_Size + 2)
Omdat indexrijen geen pagina's omvatten, moet het aantal indexrijen per pagina omlaag worden afgerond op de dichtstbijzijnde hele rij. De 2 in de formule is voor de vermelding van de rij in de sleufmatrix van de pagina.
Stap 2. De ruimte berekenen die wordt gebruikt voor het opslaan van indexinformatie op het bladniveau
U kunt de volgende stappen gebruiken om de hoeveelheid ruimte te schatten die nodig is om het bladniveau van de index op te slaan. U hebt de waarden van stap 1 nodig om deze stap te voltooien.
Geef het aantal kolommen met vaste lengte en variabele lengte op bladniveau op en bereken de benodigde ruimte voor de opslag:
Notitie
U kunt een niet-geclusterde index uitbreiden door niet-sleutelkolommen op te tellen naast de indexsleutelkolommen. Deze extra kolommen worden alleen op het bladniveau van de niet-geclusterde index opgeslagen. Zie Indexen maken met opgenomen kolommenvoor meer informatie.
Notitie
U kunt varchar, nvarchar, varbinaireof sql_variant kolommen combineren waardoor de totale gedefinieerde tabelbreedte groter is dan 8.060 bytes. De lengte van elk van deze kolommen moet nog steeds binnen de limiet van 8000 bytes vallen voor een varchar-, varbinaireof sql_variant kolom, en 4000 bytes voor nvarchar kolommen. De gecombineerde breedte kan echter groter zijn dan de limiet van 8.060 byte in een tabel. Dit geldt ook voor niet-geclusterde indexbladrijen die kolommen hebben opgenomen.
Als de niet-geclusterde index geen kolommen bevat, gebruikt u de waarden uit stap 1, inclusief eventuele wijzigingen die zijn vastgesteld in stap 1.3:
Num_Leaf_Cols = Num_Key_Cols
Fixed_Leaf_Size = Fixed_Key_Size
Aantal_Variabele_Blad_Kolommen = Aantal_Variabele_Sleutel_Kolommen
Max_Var_Leaf_Size = Max_Var_Key_Size
Als de niet-geclusterde index wel kolommen bevat, voegt u de juiste waarden toe aan de waarden uit stap 1, inclusief eventuele wijzigingen in stap 1.3. De grootte van een kolom is afhankelijk van het gegevenstype en de lengtespecificatie. Zie gegevenstypen (Transact-SQL)voor meer informatie.
Num_Leaf_Cols = Num_Key_Cols + aantal opgenomen kolommen
Fixed_Leaf_Size = Fixed_Key_Size + totale bytegrootte van opgenomen kolommen met vaste lengte
Num_Variable_Leaf_Cols = Num_Variable_Key_Cols + aantal opgenomen kolommen met variabele lengte
Max_Var_Leaf_Size = Max_Var_Key_Size + maximale bytegrootte van inbegrepen kolommen met variabele lengte
Rekening houden met de gegevensrijzoeker:
Als de niet-geclusterde index niet-uniek is, is de overhead voor de gegevensrijlokator al in overweging genomen in Stap 1.3 en zijn er geen aanvullende wijzigingen vereist. Ga naar de volgende stap.
Als de niet-geclusterde index uniek is, moet de gegevensrijzoeker worden opgenomen in alle rijen op bladniveau.
Als de niet-geclusterde index groter is dan een heap, is de gegevensrijzoeker de heap-RID (grootte 8 bytes).
Num_Leaf_Cols = Num_Leaf_Cols + 1
Num_Variable_Leaf_Cols = Num_Variable_Leaf_Cols + 1
Max_Var_Leaf_Size = Max_Var_Leaf_Size + 8
Als de niet-geclusterde index zich boven een geclusterde index bevindt, is de gegevensrijzoeker de clusteringsleutel. De kolommen die moeten worden gecombineerd met de niet-geclusterde indexsleutel, zijn de kolommen in de clustersleutel die nog niet aanwezig zijn in de set niet-geclusterde indexsleutelkolommen.
Num_Leaf_Cols = Num_Leaf_Cols + aantal clusteringsleutelkolommen die niet in de set van niet-geclusterde indexsleutelkolommen zitten (+ 1 als de geclusterde index niet-uniek is)
Fixed_Leaf_Size = Fixed_Leaf_Size + aantal clusteringsleutelkolommen met vaste lengte die niet in de set niet-geclusterde indexsleutelkolommen aanwezig zijn
Num_Variable_Leaf_Cols = Num_Variable_Leaf_Cols + het aantal clusteringsleutelkolommen met variabele lengte dat niet in de set van niet-geclusterde indexsleutelkolommen zit (+ 1 als de geclusterde index niet uniek is)
Max_Var_Leaf_Size = Max_Var_Leaf_Size + grootte in bytes van de clusteringssleutelkolommen met variabele lengte die niet in de set van niet-geclusterde indexsleutelkolommen zitten (+ 4 als de geclusterde index niet uniek is)
De grootte van de null-bitmap berekenen:
Leaf_Null_Bitmap = 2 + ((Num_Leaf_Cols + 7) / 8)
Alleen het gehele getal van de vorige expressie moet worden gebruikt. Verwijder een restgetal.
Bereken de gegevensgrootte van variabele lengte:
Als er kolommen met variabele lengte zijn (sleutelkolommen of opgenomen), inclusief eventuele benodigde clusteringsleutelkolommen zoals eerder beschreven in stap 2.2, bepaalt u hoeveel ruimte wordt gebruikt om de kolommen in de indexrij op te slaan:
Variable_Leaf_Size = 2 + (Num_Variable_Leaf_Cols x 2) + Max_Var_Leaf_Size
De bytes die zijn toegevoegd aan Max_Var_Key_Size zijn voor het bijhouden van elke variabelekolom. In deze formule wordt ervan uitgegaan dat alle kolommen met variabele lengte 100 procent vol zijn. Als u verwacht dat een kleiner percentage van de kolomopslagruimte met variabele lengte wordt gebruikt, kunt u de Max_Var_Leaf_Size waarde met dat percentage aanpassen om een nauwkeurigere schatting te maken van de totale tabelgrootte.
Als er geen kolommen met variabele lengte (sleutelkolommen of opgenomen) zijn, stelt u Variable_Leaf_Size in op 0.
De grootte van de indexrij berekenen:
Leaf_Row_Size = Fixed_Leaf_Size + Variable_Leaf_Size + Leaf_Null_Bitmap + 1 (voor de overhead van de rijkop van een indexrij)
Het aantal indexrijen per pagina berekenen (8096 gratis bytes per pagina):
Leaf_Rows_Per_Page = 8096 / (Leaf_Row_Size + 2)
Omdat indexrijen geen pagina's omvatten, moet het aantal indexrijen per pagina omlaag worden afgerond op de dichtstbijzijnde hele rij. De 2 in de formule is voor de vermelding van de rij in de sleufmatrix van de pagina.
Bereken het aantal gereserveerde gratis rijen per pagina op basis van de vulfactor opgegeven:
Free_Rows_Per_Page = 8096 x ((100 - Fill_Factor) / 100) / (Leaf_Row_Size + 2)
De opvulfactor die in de berekening wordt gebruikt, is een geheel getal in plaats van een percentage. Omdat rijen geen pagina's omvatten, moet het aantal rijen per pagina omlaag worden afgerond op de dichtstbijzijnde hele rij. Naarmate de opvulfactor groeit, worden er meer gegevens op elke pagina opgeslagen en zijn er minder pagina's. De 2 in de formule is voor de vermelding van de rij in de sleufmatrix van de pagina.
Bereken het aantal pagina's dat nodig is om alle rijen op te slaan:
Num_Leaf_Pages = Num_Rows / (Leaf_Rows_Per_Page - Free_Rows_Per_Page)
Het geschatte aantal pagina's moet worden afgerond op de dichtstbijzijnde hele pagina.
De grootte van de index berekenen (8192 totaal aantal bytes per pagina):
Leaf_Space_Used = 8192 x Num_Leaf_Pages
Stap 3. Bereken de ruimte die wordt gebruikt om indexinformatie op te slaan in de niet-bladniveaus.
Volg deze stappen om de hoeveelheid ruimte te schatten die nodig is om de tussenliggende en hoofdniveaus van de index op te slaan. U hebt de waarden uit stap 2 en 3 nodig om deze stap te voltooien.
Bereken het aantal niet-bladniveaus in de index:
Niet-bladniveaus = 1 + log( Index_Rows_Per_Page) (Num_Leaf_Pages / Index_Rows_Per_Page)
Rond deze waarde naar boven af op het dichtstbijzijnde gehele getal. Deze waarde bevat niet het bladniveau van de niet-geclusterde index.
Het aantal niet-bladpagina's in de index berekenen:
Num_Index_Pages = ∑Level (Num_Leaf_Pages/Index_Rows_Per_Page^Niveau)waarbij 1 <= Niveau <= niveaus
Rond elke som naar boven af op het dichtstbijzijnde gehele getal. Als eenvoudig voorbeeld kunt u een index overwegen waarbij Num_Leaf_Pages = 1000 en Index_Rows_Per_Page = 25. Op het eerste indexniveau boven het bladniveau worden 1000 indexrijen opgeslagen. Dit is één indexrij per bladpagina en 25 indexrijen kunnen per pagina passen. Dit betekent dat er 40 pagina's nodig zijn om die 1000 indexrijen op te slaan. Het volgende niveau van de index moet 40 rijen opslaan. Dit betekent dat er 2 pagina's nodig zijn. Het laatste niveau van de index moet 2 rijen opslaan. Dit betekent dat er één pagina is vereist. Dit levert 43 niet-blad indexpagina's op. Wanneer deze getallen worden gebruikt in de vorige formules, is het resultaat als volgt:
Niet-bladniveaus = 1 + log(25) (1000 / 25) = 3
Num_Index_Pages = 1000/(25^3)+ 1000/(25^2) + 1000/(25^1) = 1 + 2 + 40 = 43, wat het aantal pagina's is dat in het voorbeeld wordt beschreven.
De grootte van de index berekenen (8192 totaal aantal bytes per pagina):
Index_Space_Used = 8192 x Num_Index_Pages
Stap 4. Totaal van de berekende waarden
Totaal van de waarden die zijn verkregen uit de vorige twee stappen:
Niet-geclusterde indexgrootte (bytes) = Leaf_Space_Used + Index_Space_used
Bij deze berekening wordt niet rekening gehouden met het volgende:
Partitioneren
De ruimteoverhead van partitionering is minimaal, maar complex om te berekenen. Het is niet belangrijk om op te nemen.
Toewijzingspagina's
Er is ten minste één IAM-pagina gebruikt om de pagina's bij te houden die zijn toegewezen aan een heap, maar de ruimteoverhead is minimaal en er is geen algoritme om precies te berekenen hoeveel IAM-pagina's er worden gebruikt.
Grote objectwaarden (LOB)
Het algoritme om precies te bepalen hoeveel ruimte wordt gebruikt voor het opslaan van de LOB-gegevenstypen varchar(max), varbinary(max), nvarchar(max), tekst, ntext, xml-en afbeelding waarden complex is. Het is voldoende om alleen de gemiddelde grootte van de verwachte LOB-waarden toe te voegen, te vermenigvuldigen met Num_Rowsen toe te voegen aan de totale niet-geclusterde indexgrootte.
Compressie
U kunt de grootte van een gecomprimeerde index niet vooraf berekenen.
Schaarskolommen
Zie Gebruik spaarzame kolommenvoor meer informatie over de ruimtevereisten van spaarzame kolommen.
Zie ook
geclusterde en niet-geclusterde indexen beschreven
Niet-geclusterde indexen maken
geclusterde indexen maken
De grootte van een tabel schatten
de grootte van een geclusterde index schatten
De grootte van een heap schatten
De grootte van een database schatten