Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
gäller för:SQL Server
Azure SQL Database
Azure SQL Managed Instance
SQL-databas i Microsoft Fabric
Följ de här stegen för att uppskatta mängden utrymme som krävs för att lagra ett icke-grupperat index:
Beräkna variabler för användning i steg 2 och 3.
Beräkna det utrymme som används för att lagra indexinformation på bladnivån för det icke-klustrade indexet.
Beräkna det utrymme som används för att lagra indexinformation i icke-lövnivåerna i det icke-klustrade indexet.
Summera de beräknade värdena.
Steg 1. Beräkna variabler för användning i steg 2 och 3
Du kan använda följande steg för att beräkna variabler som används för att uppskatta mängden utrymme som krävs för att lagra indexets övre nivåer.
Ange antalet rader som ska finnas i tabellen:
Num_Rows = antal rader i tabellen
Ange antalet kolumner med fast längd och variabel längd i indexnyckeln och beräkna det utrymme som krävs för lagringen:
Nyckelkolumnerna i ett index kan innehålla kolumner med fast längd och variabel längd. Om du vill beräkna radstorleken för indexraden på inre nivå beräknar du det utrymme som var och en av dessa grupper av kolumner upptar inom indexraden. Storleken på en kolumn beror på datatypen och längdspecifikationen.
Num_Key_Cols = totalt antal nyckelkolumner (fast längd och variabel längd)
Fixed_Key_Size = total bytestorlek för alla nyckelkolumner med fast längd
Num_Variable_Key_Cols = antal nyckelkolumner med variabel längd
Max_Var_Key_Size = maximal bytestorlek för alla nyckelkolumner med variabel längd
Ta hänsyn till den dataradslokaliserare som krävs om indexet inte är unikt.
Om det icke-illustrerade indexet inte är unikt kombineras dataradslokaliseraren med den icke-illustrerade indexnyckeln för att skapa ett unikt nyckelvärde för varje rad.
Om det icke-klustrade indexet är över en heap, är dataradslokaliseraren heap-RID. Det här är en storlek på 8 byte.
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
Om det icke-grupperade indexet är över ett klustrat index är dataradslokaliseraren klustringsnyckeln. De kolumner som måste kombineras med den icke-klustrade indexnyckeln är de kolumner i klustringsnyckeln som inte redan finns i uppsättningen av icke-klustrade indexnyckelkolumner.
Num_Key_Cols = Num_Key_Cols + antal klustringsnyckelkolumner som inte finns i uppsättningen med icke-klustrade indexnyckelkolumner (+ 1 om det klustrade indexet inte är unikt)
Fixed_Key_Size = Fixed_Key_Size + total bytestorlek för klustringsnyckelkolumner med fast längd som inte finns i uppsättningen med icke-grupperade indexnyckelkolumner
Num_Variable_Key_Cols = Num_Variable_Key_Cols + antal klusternyckelkolumner med variabel längd som inte finns i uppsättningen med icke-klustrade indexnyckelkolumner (+ 1 om det klustrade indexet inte är unikt)
Max_Var_Key_Size = Max_Var_Key_Size + maximal bytestorlek för klusternyckelkolumner med variabel längd som inte finns i uppsättningen med icke-klustrade indexnyckelkolumner (+ 4 om det klustrade indexet inte är icke-unikt)
En del av raden, som kallas null bitmap, kan reserveras för att hantera kolumnens nullvärdehantering. Beräkna dess storlek:
Om det finns null-kolumner i indexnyckeln, inklusive eventuella nödvändiga klustringsnyckelkolumner enligt beskrivningen i steg 1.3, reserveras en del av indexraden för null-bitmappen.
Index_Null_Bitmap = 2 + ((antal kolumner i indexraden + 7) / 8)
Endast heltalsdelen av föregående uttryck ska användas. Ta bort resten.
Om det inte finns några null-nyckelkolumner anger du Index_Null_Bitmap till 0.
Beräkna datastorleken för variabellängd:
Om det finns kolumner med variabel längd i indexnyckeln, inklusive eventuella nödvändiga grupperade indexnyckelkolumner, avgör du hur mycket utrymme som används för att lagra kolumnerna i indexraden:
Variable_Key_Size = 2 + (Num_Variable_Key_Cols x 2) + Max_Var_Key_Size
Byte som läggs till i Max_Var_Key_Size används för att spåra varje variabelkolumn. Den här formeln förutsätter att alla kolumner med variabel längd är 100 procent fulla. Om du räknar med att en mindre procentandel av kolumnutrymmet med variabel längd kommer att användas kan du justera Max_Var_Key_Size värdet med den procentandelen för att ge en mer exakt uppskattning av den totala tabellstorleken.
Om det inte finns några kolumner med variabel längd anger du Variable_Key_Size till 0.
Beräkna indexradens storlek:
Index_Row_Size = Fixed_Key_Size + Variable_Key_Size + Index_Null_Bitmap + 1 (för radhuvudkostnader för en indexrad) + 6 (för den underordnade sid-ID-pekaren)
Beräkna antalet indexrader per sida (8 096 kostnadsfria byte per sida):
Index_Rows_Per_Page = 8096 / (Index_Row_Size + 2)
Eftersom indexrader inte sträcker sig över sidor bör antalet indexrader per sida avrundas nedåt till närmaste hela rad. 2 i formeln är för radens post i sidans fackmatris.
Steg 2. Beräkna det utrymme som används för att lagra indexinformation på lövnivå
Du kan använda följande steg för att uppskatta mängden utrymme som behövs för att lagra indexets lövnivå. Du behöver de värden som bevaras från steg 1 för att slutföra det här steget.
Ange antalet kolumner med fast längd och variabel längd på lövnivå och beräkna det utrymme som krävs för lagringen:
Obs
Du kan utöka ett icke-grupperat index genom att inkludera icke-nyckelkolumner utöver indexnyckelkolumnerna. Dessa ytterligare kolumner lagras endast på bladnivå för det icke-klustrade indexet. Mer information finns i Skapa index med inkluderade kolumner.
Not
Du kan kombinera varchar, nvarchar, varbinaryeller sql_variant kolumner som gör att den totala definierade tabellbredden överskrider 8 060 byte. Längden på var och en av dessa kolumner måste fortfarande ligga inom gränsen på 8 000 byte för en varchar, varbinary, eller sql_variant kolumn och 4 000 byte för nvarchar kolumner. Deras sammanlagda bredd kan dock överskrida gränsen på 8 060 byte i en tabell. Detta gäller även för ickeklustrade indexbladsrader som har inkluderade kolumner.
Om det icke-grupperade indexet inte har några inkluderade kolumner använder du värdena från steg 1, inklusive eventuella ändringar som fastställs i steg 1.3:
Num_Leaf_Cols = Num_Key_Cols
Fast Storlek på Blad = Fast Nyckelstorlek
Num_Variable_Leaf_Cols = Num_Variable_Key_Cols
Max_Var_Leaf_Size = Max_Var_Key_Size
Om det icke-klustrade indexet har inkluderade kolumner, lägg till de lämpliga värdena till värdena från steg 1, inklusive eventuella ändringar i steg 1.3. Storleken på en kolumn beror på datatypen och längdspecifikationen. Mer information finns i datatyper (Transact-SQL).
Num_Leaf_Cols = Num_Key_Cols + antal inkluderade kolumner
Fixed_Leaf_Size = Fixed_Key_Size + total bytesstorlek för inkluderade kolumner med fast längd
Num_Variable_Leaf_Cols = Num_Variable_Key_Cols + antal kolumner med variabel längd som ingår
Max_Var_Leaf_Size = Max_Var_Key_Size + maximal bytestorlek för kolumner med variabel längd
Konto för dataradslokaliseraren:
Om det icke-klustrade indexet inte är icke-unikt, har omkostnaderna för dataradslokaliseraren redan övervägts i steg 1.3 och inga ytterligare ändringar krävs. Gå till nästa steg.
Om det icke-klustrade indexet är unikt måste dataradslokaliseraren redovisas i alla rader på lövnivå.
Om det icke-klustrade indexet är över en heap är dataradslokaliseraren en heap RID (storlek: 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
Om det icke-grupperade indexet är över ett klustrat index är dataradslokaliseraren klustringsnyckeln. De kolumner som ska kombineras med den icke-klustrade indexnyckeln är de kolumner i klusterindexnyckeln som inte redan finns i uppsättningen med icke-klustrade indexnyckelkolumner.
Num_Leaf_Cols = Num_Leaf_Cols + antal klustringsnyckelkolumner som inte finns i uppsättningen med ickeklustrade indexnyckelkolumner (+ 1 om det klustrade indexet inte är icke-unikt)
Fixed_Leaf_Size = Fixed_Leaf_Size + antal kolumner med klustringsnycklar med fast längd som inte finns i uppsättningen med icke-grupperade indexnyckelkolumner
Num_Variable_Leaf_Cols = Num_Variable_Leaf_Cols + antal klusternyckelkolumner med variabel längd som inte finns i uppsättningen med icke-klustrade indexnyckelkolumner (+ 1 om det klustrade indexet inte är unikt)
Max_Var_Leaf_Size = Max_Var_Leaf_Size + storlek i byte för variabel-längd klustringsnyckelkolumner som inte finns i uppsättningen med icke-klustrade indexnyckelkolumner (+ 4 om det klustrade indexet inte är unikt)
Beräkna storleken på null-bitmapen:
Leaf_Null_Bitmap = 2 + ((Num_Leaf_Cols + 7) / 8)
Endast heltalsdelen av föregående uttryck ska användas. Ta bort resten.
Beräkna datastorleken för variabellängd:
Om det finns kolumner med variabel längd (nyckelkolumner eller inkluderade), inklusive eventuella nödvändiga klustringsnyckelkolumner som beskrivs tidigare i steg 2.2, avgör du hur mycket utrymme som används för att lagra kolumnerna i indexraden:
Variable_Leaf_Size = 2 + (Num_Variable_Leaf_Cols x 2) + Max_Var_Leaf_Size
Byte som läggs till i Max_Var_Key_Size används för att spåra varje variabelkolumn. Den här formeln förutsätter att alla kolumner med variabel längd är 100 procent fulla. Om du räknar med att en mindre procentandel av kolumnutrymmet med variabel längd kommer att användas kan du justera Max_Var_Leaf_Size värdet med den procentandelen för att ge en mer exakt uppskattning av den totala tabellstorleken.
Om det inte finns några kolumner med variabel längd (nyckelkolumner eller inkluderade) anger du Variable_Leaf_Size till 0.
Beräkna indexradens storlek:
Leaf_Row_Size = Fixed_Leaf_Size + Variable_Leaf_Size + Leaf_Null_Bitmap + 1 (för radrubriksöverhuvud för en indexrad)
Beräkna antalet indexrader per sida (8 096 kostnadsfria byte per sida):
Leaf_Rows_Per_Page = 8096 / (Leaf_Row_Size + 2)
Eftersom indexrader inte sträcker sig över sidor bör antalet indexrader per sida avrundas nedåt till närmaste hela rad. 2 i formeln är för radens post i sidans fackmatris.
Beräkna antalet reserverade kostnadsfria rader per sida baserat på fyllningsfaktor angett:
Free_Rows_Per_Page = 8096 x ((100 - Fill_Factor) / 100) / (Leaf_Row_Size + 2)
Fyllningsfaktorn som används i beräkningen är ett heltalsvärde i stället för en procentandel. Eftersom rader inte sträcker sig över sidor bör antalet rader per sida avrundas nedåt till närmaste hela rad. När fyllningsfaktorn växer lagras mer data på varje sida och det blir färre sidor. 2 i formeln är för radens post i sidans fackmatris.
Beräkna antalet sidor som krävs för att lagra alla rader:
Num_Leaf_Pages = Num_Rows / (Leaf_Rows_Per_Page - Free_Rows_Per_Page)
Antalet beräknade sidor bör avrundas upp till närmaste hela sida.
Beräkna storleken på indexet (totalt 8 192 byte per sida):
Leaf_Space_Used = 8192 x Num_Leaf_Pages
Steg 3. Beräkna det utrymme som används för att lagra indexinformation på icke-lövnivåer
Följ de här stegen för att uppskatta hur mycket utrymme som krävs för att lagra indexets mellanliggande nivåer och rotnivåer. Du behöver de värden som bevaras från steg 2 och 3 för att slutföra det här steget.
Beräkna antalet icke-lövnivåer i indexet:
Icke-lövnivåer = 1 + log( Index_Rows_Per_Page) (Num_Leaf_Pages / Index_Rows_Per_Page)
Avrunda det här värdet upp till närmaste heltal. Det här värdet inkluderar inte lövnivån för det icke-klustrade indexet.
Beräkna antalet icke-lövsidor i indexet:
Num_Index_Pages = ∑Level (Num_Leaf_Pages/Index_Rows_Per_Page^Level)där 1 <= nivå <= nivåer
Avrunda varje summand upp till närmaste heltal. Som ett enkelt exempel bör du överväga ett index där Num_Leaf_Pages = 1 000 och Index_Rows_Per_Page = 25. Den första indexnivån ovanför lövnivån lagrar 1 000 indexrader, vilket är en indexrad per lövsida och 25 indexrader får plats per sida. Det innebär att 40 sidor krävs för att lagra dessa 1 000 indexrader. Nästa nivå i indexet måste lagra 40 rader. Det innebär att det krävs 2 sidor. Den sista nivån i indexet måste lagra 2 rader. Det innebär att det krävs 1 sida. Detta ger 43 icke-bladindexsidor. När dessa tal används i tidigare formler blir resultatet följande:
Icke-blad_Nivåer = 1 + log(25) (1000 / 25) = 3
Num_Index_Pages = 1000/(25^3)+ 1000/(25^2) + 1000/(25^1) = 1 + 2 + 40 = 43, vilket är antalet sidor som beskrivs i exemplet.
Beräkna storleken på indexet (totalt 8 192 byte per sida):
Använt_indexutrymme = 8192 x Antal_indexesidor
Steg 4. Summera de beräknade värdena
Summera de värden som hämtades från de föregående två stegen:
Icke-grupperad indexstorlek (byte) = Leaf_Space_Used + Index_Space_used
Den här beräkningen tar inte hänsyn till följande:
Partitionering
Utrymmeskostnaderna från partitionering är minimala, men komplexa att beräkna. Det är inte viktigt att ta med.
Allokeringssidor
Det finns minst en IAM-sida som används för att spåra de sidor som allokerats till en heap, men utrymmeskostnaderna är minimala och det finns ingen algoritm för att deterministiskt beräkna exakt hur många IAM-sidor som ska användas.
Värden för stora objekt (LOB)
Algoritmen för att avgöra exakt hur mycket utrymme som ska användas för att lagra LOB-datatyperna varchar(max), varbinary(max), nvarchar(max), text, ntext, xmloch bild värden är komplexa. Det räcker att bara lägga till den genomsnittliga storleken på de förväntade LOB-värdena, multiplicera med Num_Rowsoch lägga till det till den icke-klustrade indexstorleken.
Komprimering
Du kan inte beräkna storleken på ett komprimerat index i förväg.
Glesa kolumner
Information om utrymmeskraven för glesa kolumner finns i Använda glesa kolumner.
Se även
Grupperade och icke-grupperade index beskrivna
Skapa icke-grupperade index
Skapa klustrade index
Beräkna storleken på en tabell
Beräkna storleken på ett grupperat index
Beräkna storleken på en heap
Beräkna storleken på en databas