Sdílet prostřednictvím


Odhad velikosti neclusterovaného indexu

Platí pro:SQL ServerAzure SQL DatabaseSpravovaná instance Azure SQLDatabáze SQL v Microsoft Fabric

Při odhadu velikosti místa potřebného k uložení neclusterovaného indexu postupujte takto:

  1. Výpočet proměnných pro použití v krocích 2 a 3

  2. Vypočítejte místo použité k uložení informací indexu na úrovni listu neclusterovaného indexu.

  3. Vypočítejte místo použité k uložení informací indexu v neclusterovaných úrovních indexu, které nejsou typu list.

  4. Součet počítaných hodnot

Krok 1. Výpočet proměnných pro použití v krocích 2 a 3

Následující kroky můžete použít k výpočtu proměnných, které se používají k odhadu množství místa potřebného k uložení horních úrovní indexu.

  1. Zadejte počet řádků, které budou v tabulce přítomné:

    • Num_Rows = počet řádků v tabulce
  2. Zadejte počet sloupců s pevnou délkou a proměnlivou délkou v klíči indexu a vypočítejte požadovaný prostor pro úložiště:

    Klíčové sloupce indexu mohou obsahovat sloupce s pevnou délkou a proměnnou délkou. Pokud chcete odhadnout velikost řádku indexu na úrovni interiéru, vypočítejte mezeru, kterou každá z těchto skupin sloupců zabírá v řádku indexu. Velikost sloupce závisí na datovém typu a specifikaci délky.

    • Num_Key_Cols = celkový počet klíčových sloupců (pevná délka a proměnná délka)
    • Fixed_Key_Size = celková velikost bajtů všech sloupců klíčů s pevnou délkou
    • Num_Variable_Key_Cols = počet sloupců klíče s proměnnou délkou
    • Max_Var_Key_Size = maximální velikost bajtu všech sloupců klíčů s proměnnou délkou
  3. Vezměte v úvahu lokátor řádku dat, který je nutný, pokud index není jedinečný.

    Pokud je neclusterovaný index nevýznamný, lokátor datového řádku se zkombinuje s neclusterovaným indexovým klíčem a vytvoří jedinečnou hodnotu klíče pro každý řádek.

    Pokud je neklastrovaný index vytvořen nad haldou, lokátor řádku dat je identifikátor RID haldy. Jedná se o velikost 8 bajtů.

    • Num_Key_Cols = Num_Key_ColsNum_Key_Cols + 1
    • Počet_Proměnných_Klíčových_Sloupců = Počet_Proměnných_Klíčových_Sloupců + 1
    • Max_Var_Key_Size = Max_Var_Key_SizeMax_Var_Key_Size + 8

    Pokud je neclusterovaný index nad clusterovaným indexem, je lokátorem datového řádku klíč clusteringu. Sloupce, které se musí kombinovat s neclusterovaným indexovým klíčem, jsou sloupce v klíči clusteringu, které ještě nejsou v sadě neclusterovaných sloupců s klíčem indexu.

    • Num_Key_Cols = Num_Key_Cols + počet sloupců s klíči clusteringu, které nejsou v sadě neclusterovaných sloupců s klíči indexu (+ 1, pokud clusterovaný index neníunique)

    • Fixed_Key_Size = Fixed_Key_Size + celková velikost bajtů sloupců s klíči clusteringu s pevnou délkou, které nejsou v sadě neclusterovaných sloupců klíčů indexu

    • Num_Variable_Key_Cols = Num_Variable_Key_Cols + počet sloupců klíče clusteringu s proměnnou délkou, které nejsou v sadě neclusterovaných sloupců indexového klíče (+ 1, pokud clusterovaný index neníunique)

    • Max_Var_Key_Size = Max_Var_Key_Size + maximální velikost bajtu sloupců s klíči s proměnnou délkou, které nejsou v sadě neclusterovaných sloupců s klíči indexu (+ 4, pokud clusterovaný index neníunique)

  4. Část řádku, známá jako bitmapová mapa nul, může být vyhrazena ke správě nulovosti sloupců. Vypočítat jeho velikost:

    Pokud jsou v klíči indexu sloupce s hodnotou null, včetně všech potřebných sloupců clusterovacího klíče, jak je popsáno v kroku 1.3, je část řádku indexu vyhrazena pro bitmapu null.

    • Index_Null_Bitmap = 2 + ((počet sloupců v řádku indexu + 7) / 8)

    Měla by se použít pouze celočíselná část předchozího výrazu. Zahoďte zbývající část.

    Pokud neexistují žádné klíčové sloupce s možnou hodnotou null, nastavte Index_Null_Bitmap na hodnotu 0.

  5. Výpočet velikosti dat o délce proměnné:

    Pokud jsou v klíči indexu sloupce s proměnnou délkou, včetně všech potřebných sloupců clusterovaných klíčů indexu, určete, kolik místa se použije k uložení sloupců v řádku indexu:

    • Proměnlivá_Velikost_Klíče = 2 + (Počet_Proměnlivých_Klíčových_Sloupců x 2) + Max_Proměnlivá_Velikost_Klíče

    Bajty přidané do Max_Var_Key_Size slouží ke sledování jednotlivých sloupců proměnných. Tento vzorec předpokládá, že všechny sloupce s proměnlivou délkou jsou plné 100 procent. Pokud předpokládáte, že se použije menší procento prostoru úložiště s proměnlivou délkou, můžete upravit Max_Var_Key_Size hodnotu podle tohoto procenta, abyste mohli získat přesnější odhad celkové velikosti tabulky.

    Pokud neexistují žádné sloupce s proměnlivou délkou, nastavte Variable_Key_Size na 0.

  6. Výpočet velikosti řádku indexu:

    • Index_Row_Size = Fixed_Key_Size + Variable_Key_Size + Index_Null_Bitmap + 1 (pro režii záhlaví řádku indexu) + 6 (pro ukazatel ID podřízené stránky)
  7. Výpočet počtu řádků indexu na stránku (8 096 volných bajtů na stránku):

    • Index_Rows_Per_Page = 8096 / (Index_Row_Size + 2)

    Vzhledem k tomu, že řádky indexu nepřesahují stránky, měl by se počet řádků indexu na stránku zaokrouhlit dolů na nejbližší celý řádek. Hodnota 2 ve vzorci je určena pro záznam řádku v poli slotů stránky.

Krok 2. Výpočet místa použitého k uložení informací indexu na úrovni listu

Pomocí následujících kroků můžete odhadnout množství místa potřebného k uložení úrovně listu indexu. K dokončení tohoto kroku potřebujete hodnoty zachované z kroku 1.

  1. Zadejte počet sloupců s pevnou délkou a proměnlivou délkou na úrovni listu a vypočítejte prostor potřebný pro jejich úložiště:

    Neclusterovaný index můžete rozšířit zahrnutím sloupců bez klíče kromě sloupců klíče indexu. Tyto další sloupce jsou uloženy pouze na úrovni listu neclusterovaného indexu. Další informace najdete v tématu Vytváření indexů se zahrnutými sloupci.

    Note

    Můžete kombinovat varchar, nvarchar, varbinárnínebo sql_variant sloupce, které způsobují, že celková definovaná šířka tabulky přesahuje 8 060 bajtů. Délka každého z těchto sloupců musí stále spadat do limitu 8 000 bajtů pro sloupec varchar, varbinary, nebo sql_variant a 4 000 bajtů pro sloupec nvarchar. Jejich kombinované šířky ale můžou překročit limit 8 060 bajtů v tabulce. To platí také pro neclusterované řádky listu indexu, které obsahují sloupce.

    Pokud neclusterovaný index neobsahuje žádné zahrnuté sloupce, použijte hodnoty z kroku 1, včetně všech úprav určených v kroku 1.3:

    • Počet_Listových_Sloupců = Počet_Klíčových_Sloupců
    • Fixní_Velikost_Listu = Fixní_Velikost_Klíče
    • = Num_Variable_Leaf_ColsNum_Variable_Key_Cols
    • Max_Var_Leaf_Size = Max_Var_Key_Size

    Pokud neclusterovaný index obsahuje zahrnuté sloupce, přidejte příslušné hodnoty k hodnotám z kroku 1, včetně všech úprav v kroku 1.3. Velikost sloupce závisí na datovém typu a specifikaci délky. Další informace naleznete v tématu Datové typy.

    • Num_Leaf_Cols = Num_Key_Cols + počet zahrnutých sloupců
    • Fixed_Leaf_Size = Fixed_Key_Size + celková velikost bajtů zahrnutých sloupců s pevnou délkou
    • Num_Variable_Leaf_Cols = Num_Variable_Key_Cols + počet zahrnutých sloupců s proměnlivou délkou
    • Max_Var_Leaf_Size = Max_Var_Key_Size + maximální velikost bajtu zahrnutých sloupců s proměnnou délkou
  2. Zohlednit lokátor datového řádku:

    Pokud je neklastrovaný index neunikátní, náklady na určení řádku dat již byly zohledněny v kroku 1.3 a nejsou potřeba žádné další úpravy. Přejděte k dalšímu kroku.

    Pokud je neklastrovaný index jedinečný, musí být lokátor řádku dat započítán do všech řádků na úrovni listu.

    Pokud je neklastrovaný index vytvořen nad haldou, lokátor datového řádku je identifikátor RID haldy (velikost 8 bajtů).

    • = Num_Leaf_ColsNum_Leaf_Cols + 1
    • Num_Variable_Leaf_Cols = Num_Variable_Leaf_Cols + 1
    • Max_Var_Leaf_Size = Max_Var_Leaf_SizeMax_Var_Leaf_Size + 8

    Pokud je neclusterovaný index nad clusterovaným indexem, je lokátorem datového řádku klíč clusteringu. Sloupce, které se musí kombinovat s neclusterovaným indexovým klíčem, jsou sloupce v klíči clusteringu, které ještě nejsou v sadě neclusterovaných sloupců s klíčem indexu.

    • Num_Leaf_Cols = Num_Leaf_Cols + počet sloupců klíčů clusteringu, které nejsou v sadě neclusterovaných sloupců s klíči indexu (+ 1, pokud clusterovaný index neníunique)

    • Fixed_Leaf_Size = Fixed_Leaf_Size + počet sloupců klíčů s pevnou délkou, které nejsou zahrnuty v sadě klíčových sloupců neklastrovaného indexu

    • Num_Variable_Leaf_Cols = Num_Variable_Leaf_Cols + počet sloupců klíče clusteringu s proměnnou délkou, které nejsou v sadě neclusterovaných sloupců s klíči indexu (+ 1, pokud clusterovaný index neníunique)

    • Max_Var_Leaf_Size = Max_Var_Leaf_Size + velikost v bajtech clusteringových klíčových sloupců s proměnnou délkou, ne v sadě neclusterovaných sloupců s klíči indexu (+ 4, pokud clusterovaný index neníunique)

  3. Výpočet velikosti rastrového obrázku s hodnotou null:

    • Leaf_Null_Bitmap = 2 + ((Num_Leaf_Cols + 7) / 8)

    Měla by se použít pouze celočíselná část předchozího výrazu. Zahoďte zbývající část.

  4. Výpočet velikosti dat o délce proměnné:

    Pokud existují sloupce s proměnnou délkou (klíčové sloupce nebo zahrnuté), včetně všech potřebných sloupců klíčů clusteringu, jak je popsáno výše v kroku 2.2, určete, kolik místa se použije k uložení sloupců v řádku indexu:

    • Proměnná_Velikost_Listu = 2 + (Počet_Proměnných_Sloupců_Listu x 2) + Max_Proměnná_Velikost_Listu

    Bajty přidané do Max_Var_Key_Size slouží ke sledování jednotlivých sloupců proměnných. Tento vzorec předpokládá, že všechny sloupce s proměnlivou délkou jsou plné 100 procent. Pokud předpokládáte, že se použije menší procento prostoru úložiště sloupců s proměnlivou délkou, můžete upravit Max_Var_Leaf_Size hodnotu podle tohoto procenta, abyste mohli získat přesnější odhad celkové velikosti tabulky.

    Pokud nejsou žádné sloupce s proměnnou délkou (klíčové sloupce nebo zahrnuté), nastavte Variable_Leaf_Size na hodnotu 0.

  5. Výpočet velikosti řádku indexu:

    • Leaf_Row_Size = Fixed_Leaf_Size + Variable_Leaf_Size + Leaf_Null_Bitmap + 1 (pro režii záhlaví řádku indexu)
  6. Výpočet počtu řádků indexu na stránku (8 096 volných bajtů na stránku):

    • Počet_řádků_na_list = 8096 / (Velikost_řádku_na_listu + 2)

    Vzhledem k tomu, že řádky indexu nepřesahují stránky, měl by se počet řádků indexu na stránku zaokrouhlit dolů na nejbližší celý řádek. Hodnota 2 ve vzorci je určena pro záznam řádku v poli slotů stránky.

  7. Vypočítejte počet volných rezervovaných řádků na stránku na základě zadaného faktoru vyplnění .

    • Free_Rows_Per_Page = 8096 x ((100 - Fill_Factor) / 100) / (Leaf_Row_Size + 2)

    Faktor výplně použitý ve výpočtu je celočíselná hodnota místo procenta. Vzhledem k tomu, že řádky nepřesahují stránky, měl by se počet řádků na stránku zaokrouhlit dolů na nejbližší celý řádek. S rostoucím faktorem výplně se na každé stránce ukládá více dat a na každé stránce je méně stránek. Hodnota 2 ve vzorci je určena pro záznam řádku v poli slotů stránky.

  8. Výpočet počtu stránek potřebných k uložení všech řádků:

    • Num_Leaf_Pages = Num_Rows / (Leaf_Rows_Per_Page - Free_Rows_Per_Page)

    Odhadovaný počet stránek by se měl zaokrouhlit nahoru na nejbližší celou stránku.

  9. Vypočítat velikost indexu (celkem 8 192 bajtů na stránku):

    • Prostor_Použitý_Větvemi = 8192 x Počet_Listových_Stránek

Krok 3. Vypočítejte prostor používaný k ukládání indexových informací v ne-listových úrovních

Při odhadu velikosti místa potřebného k uložení mezilehlých a kořenových úrovní indexu postupujte podle těchto kroků. K dokončení tohoto kroku potřebujete hodnoty zachované z kroků 2 a 3.

  1. Vypočítejte počet ne-listových úrovní v indexu.

    • Ne-listové úrovně = 1 + log(Index_Rows_Per_Page) (Num_Leaf_Pages / Index_Rows_Per_Page)

    Zaokrouhlí tuto hodnotu nahoru na nejbližší celé číslo. Tato hodnota nezahrnuje úroveň listu neclusterovaného indexu.

  2. Vypočítejte počet nelistových stránků v indexu:

    • Num_Index_Pages = ∑Level (Num_Leaf_Pages/Index_Rows_Per_Page^Level), kde 1 <= Úroveň <= Úrovně

    Zaokrouhlí každý součet nahoru na nejbližší celé číslo. Jako jednoduchý příklad zvažte index, kde Num_Leaf_Pages = 1000 a Index_Rows_Per_Page = 25. První úroveň indexu nad úrovní listu ukládá 1 000 řádků indexu, což je jeden řádek indexu na listovou stránku a 25 řádků indexu se může vejít na stránku. To znamená, že pro uložení těchto 1 000 řádků indexu je potřeba 40 stránek. Další úroveň indexu musí uložit 40 řádků. To znamená, že vyžaduje 2 stránky. Poslední úroveň indexu musí ukládat 2 řádky. To znamená, že vyžaduje 1 stránku. Výsledkem je 43 ne-listových indexových stránek. Pokud se tato čísla použijí v předchozích vzorcích, výsledek je následující:

    • non-leaf_Levels = 1 + log(25) (1000 / 25) = 3

    • Num_Index_Pages = 1000/(25^3)+ 1000/(25^2) + 1000/(25^1) = 1 + 2 + 40 = 43, což je počet stránek popsaných v příkladu.

  3. Vypočítat velikost indexu (celkem 8 192 bajtů na stránku):

    • Dynamika_prostoru_indexu = 8192 x Počet_stranek_indexu

Krok 4. Součet počítaných hodnot

Součet hodnot získaných z předchozích dvou kroků:

Neclusterovaná velikost indexu (bajty) = Leaf_Space_Used + Index_Space_used

Tento výpočet nebere v úvahu následující podmínky:

  • Dělení: Prostorová režie způsobená dělením je minimální, ale složitá k vypočítání. Není důležité zahrnout.

  • Stránky přidělení: Ke sledování stránek přidělených haldě se používá alespoň jedna stránka IAM, ale režijní náklady na prostor jsou minimální a neexistuje žádný algoritmus, který by deterministicky vypočítal, kolik IAM stránek má být použito.

  • Velké hodnoty objektu (LOB): Algoritmus určující přesně, kolik místa se použije k uložení datových typů LOB varchar(max), varbinary(max), nvarchar(max), text, ntext, xml a image hodnoty je složitý. Stačí přidat průměrnou velikost očekávaných hodnot LOB, vynásobit Num_Rows a přidat ji k celkové neclusterované velikosti indexu.

  • Komprese: Velikost komprimovaného indexu nelze předem vypočítat.

  • Řídké sloupce: Informace o požadavcích na prostor řídkých sloupců najdete v tématu Použití řídkých sloupců.