Udostępnij za pośrednictwem


Szacowanie rozmiaru indeksu nieklastrowanego

Dotyczy:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceSQL Database w Microsoft Fabric

Wykonaj następujące kroki, aby oszacować ilość miejsca wymaganego do przechowywania indeksu nieklastrowanego:

  1. Oblicz zmienne do użycia w krokach 2 i 3.

  2. Oblicz miejsce używane do przechowywania informacji o indeksie na poziomie liścia indeksu nieklastrowanego.

  3. Oblicz miejsce używane do przechowywania informacji o indeksie na poziomach nie-liściach w strukturze indeksu nieklastrowanego.

  4. Łączna liczba obliczonych wartości.

Krok 1. Obliczanie zmiennych do użycia w krokach 2 i 3

Poniższe kroki umożliwiają obliczenie zmiennych używanych do oszacowania ilości miejsca wymaganego do przechowywania wyższych poziomów indeksu.

  1. Określ liczbę wierszy, które będą obecne w tabeli:

    Num_Rows = liczba wierszy w tabeli

  2. Określ liczbę kolumn o stałej długości i zmiennej długości w kluczu indeksu i oblicz miejsce wymagane dla ich magazynu:

    Kolumny klucza indeksu mogą zawierać kolumny o stałej długości i zmiennej długości. Aby oszacować rozmiar wiersza indeksu na poziomie wnętrza, oblicz przestrzeń zajmowaną przez każdą z tych grup kolumn w wierszu indeksu. Rozmiar kolumny zależy od typu danych i specyfikacji długości.

    Num_Key_Cols = całkowita liczba kolumn klucza (o stałej długości i zmiennej długości)

    Fixed_Key_Size = łączny rozmiar bajtów wszystkich kolumn kluczy o stałej długości

    Num_Variable_Key_Cols = liczba kolumn kluczy o zmiennej długości

    Max_Var_Key_Size = maksymalny rozmiar bajtów wszystkich kolumn kluczy o zmiennej długości

  3. Uwzględnij lokalizator wierszy danych, który jest wymagany, jeśli indeks jest nieunikatowy.

    Jeśli indeks nieklastrowany jest niezgodny, lokalizator wierszy danych jest połączony z kluczem indeksu nieklastrowanego w celu wygenerowania unikatowej wartości klucza dla każdego wiersza.

    Jeśli indeks nieklastrowany znajduje się na stercie, lokalizator wierszy danych jest identyfikatorem RID stertu. Jest to rozmiar 8 bajtów.

    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

    Jeśli indeks nieklastrowany jest za pośrednictwem indeksu klastrowanego, lokalizator wierszy danych jest kluczem klastrowania. Kolumny, które muszą być połączone z kluczem indeksu nieklastrowanego, to kolumny w kluczu klastrowania, które nie są jeszcze obecne w zestawie kolumn klucza indeksu nieklastrowanego.

    Num_Key_Cols = Num_Key_Cols + liczba kolumn kluczy klastrowania, które nie są w zestawie kluczowych kolumn indeksu nieklastrowanego (+ 1, jeśli indeks klastrowany jest nieunikalny)

    Fixed_Key_Size = Fixed_Key_Size + łączny rozmiar bajtów kolumn klucza klastrowania o stałej długości, które nie są częścią zestawu kolumn kluczy indeksu nieklastrowanego

    Num_Variable_Key_Cols = Num_Variable_Key_Cols + liczba kolumn kluczy klastrowania o zmiennej długości, które nie są częścią zestawu nieklastrowanych kolumn kluczy indeksu (+ 1, jeśli indeks klastrowany jest nieunikatowy)

    Max_Var_Key_Size = Max_Var_Key_Size + maksymalny rozmiar bajtów kolumn kluczy klastrowania o zmiennej długości, które nie są częścią zestawu kolumn klucza indeksu nieklastrowanego (+ 4, jeśli indeks klastrowany jest nieunikatowy)

  4. Część wiersza, znana jako mapa bitowa null, może być zarezerwowana do zarządzania kolumnami, które mogą przyjmować wartość null. Oblicz jego rozmiar:

    Jeśli w kluczu indeksu znajdują się kolumny dopuszczające wartość null, w tym wszystkie niezbędne kolumny kluczy klastrowania zgodnie z opisem w kroku 1.3, część wiersza indeksu jest zarezerwowana dla mapy bitowej o wartości null.

    Index_Null_Bitmap = 2 + ((liczba kolumn w wierszu indeksu + 7) / 8)

    Należy użyć tylko części całkowitej poprzedniego wyrażenia. Odrzuć resztę.

    Jeśli nie ma kolumn klucza dopuszczalnego wartości null, ustaw wartość Index_Null_Bitmap na 0.

  5. Oblicz rozmiar danych o zmiennej długości:

    Jeśli w kluczu indeksu znajdują się kolumny o zmiennej długości, w tym wszelkie niezbędne kolumny klucza indeksu klastrowanego, określ, ile miejsca jest używane do przechowywania kolumn w wierszu indeksu:

    Variable_Key_Size = 2 + (Num_Variable_Key_Cols x 2) + Max_Var_Key_Size

    Bajty dodane do Max_Var_Key_Size służą do śledzenia każdej kolumny zmiennej. W tej formule przyjęto założenie, że wszystkie kolumny o zmiennej długości są pełne o 100%. Jeśli przewidujesz, że zostanie użyty mniejszy procent miejsca do magazynowania w kolumnie o zmiennej długości, możesz dostosować wartość Max_Var_Key_Size o ten procent, aby uzyskać dokładniejsze oszacowanie ogólnego rozmiaru tabeli.

    Jeśli nie ma kolumn o zmiennej długości, ustaw wartość Variable_Key_Size na 0.

  6. Oblicz rozmiar wiersza indeksu:

    Index_Row_Size = Fixed_Key_Size + Variable_Key_Size + Index_Null_Bitmap + 1 (dla narzutu nagłówka wiersza indeksu) + 6 (dla wskaźnika ID strony potomnej)

  7. Oblicz liczbę wierszy indeksu na stronę (8096 wolnych bajtów na stronę):

    Index_Rows_Per_Page = 8096 / (Index_Row_Size + 2)

    Ponieważ wiersze indeksu nie obejmują stron, liczba wierszy indeksu na stronę powinna być zaokrąglona w dół do najbliższego całego wiersza. Wartość 2 w formule dotyczy wpisu wiersza w tablicy miejsc strony.

Krok 2. Obliczanie miejsca używanego do przechowywania informacji o indeksie na poziomie liścia

Poniższe kroki umożliwiają oszacowanie ilości miejsca wymaganego do przechowywania poziomu liści indeksu. Do wykonania tego kroku będą potrzebne wartości zachowane z kroku 1.

  1. Określ liczbę kolumn o stałej długości i zmiennej długości na poziomie liścia i oblicz miejsce wymagane dla ich magazynu:

    Notatka

    Indeks nieklastrowany można rozszerzyć, dołączając kolumny inne niż kluczowe oprócz kolumn klucza indeksu. Te dodatkowe kolumny są przechowywane tylko na poziomie liścia indeksu nieklastrowanego. Aby uzyskać więcej informacji, zobacz Tworzenie indeksów z dołączonymi kolumnami.

    Notatka

    Można połączyć kolumny varchar, nvarchar, varbinarylub sql_variant, co powoduje, że łączna zdefiniowana szerokość tabeli przekracza 8 060 bajtów. Długość każdej z tych kolumn musi nadal mieścić się w granicach 8000 bajtów dla kolumn varchar , varbinary lub sql_variant , oraz 4000 bajtów dla kolumn nvarchar . Jednak ich połączone szerokości mogą przekraczać limit 8060 bajtów w tabeli. Dotyczy to również nieklastrowanych wierszy liści indeksu, które zawierały kolumny.

    Jeśli indeks nieklastrowany nie zawiera żadnych dołączonych kolumn, użyj wartości z kroku 1, w tym wszelkich modyfikacji określonych w kroku 1.3:

    Num_Leaf_Cols = Num_Key_Cols

    Stały_Rozmiar_Liścia = Stały_Rozmiar_Klucza

    Liczba_Zmiennych_Kol_Lisci = Liczba_Zmiennych_Kol_Kluczy

    Max_Var_Leaf_Size = Max_Var_Key_Size

    Jeśli indeks nieklastrowany zawiera kolumny, dodaj odpowiednie wartości do wartości z kroku 1, w tym wszelkie modyfikacje w kroku 1.3. Rozmiar kolumny zależy od typu danych i specyfikacji długości. Aby uzyskać więcej informacji, zobacz Typy danych (Transact-SQL).

    Num_Leaf_Cols = Num_Key_Cols + liczba dołączonych kolumn

    Fixed_Leaf_Size = Fixed_Key_Size + całkowity rozmiar bajtów dołączonych kolumn o stałej długości

    Num_Variable_Leaf_Cols = Num_Variable_Key_Cols + liczba dołączonych kolumn o zmiennej długości

    Max_Var_Leaf_Size = Max_Var_Key_Size + maksymalny rozmiar bajtów w kolumnach o zmiennej długości

  2. Uwzględnij lokalizator wierszy danych:

    Jeśli indeks nieklastrowany jest nieokreślony, obciążenie lokalizatora wierszy danych zostało już uwzględnione w kroku 1.3 i nie są wymagane żadne dodatkowe modyfikacje. Przejdź do następnego kroku.

    Jeśli indeks nieklastrowany jest unikatowy, lokalizator wierszy danych musi być uwzględniany we wszystkich wierszach na poziomie liścia.

    Jeśli indeks nieklastrowany znajduje się na stercie, lokalizator wierszy danych to identyfikator wiersza sterty (RID) o rozmiarze 8 bajtów.

    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

    Jeśli indeks nieklastrowany jest za pośrednictwem indeksu klastrowanego, lokalizator wierszy danych jest kluczem klastrowania. Kolumny, które muszą być połączone z kluczem indeksu nieklastrowanego, to kolumny w kluczu klastrowania, które nie są jeszcze obecne w zestawie kolumn klucza indeksu nieklastrowanego.

    Num_Leaf_Cols = Num_Leaf_Cols + liczba kolumn kluczy klastrowania, które nie znajdują się w zestawie kolumn kluczy indeksu nieklastrowanego (+1, jeśli indeks klastrowany jest nieunikalny)

    Fixed_Leaf_Size = Fixed_Leaf_Size + liczba kolumn kluczy klastrowania o stałej długości, które nie znajdują się w zbiorze nieklastrowanych kolumn kluczy indeksu

    Num_Variable_Leaf_Cols = Num_Variable_Leaf_Cols + liczba kolumn kluczy klastrowania o zmiennej długości, które nie znajdują się w zestawie nieklastrowanych kolumn kluczy indeksu (+ 1, jeśli indeks klastrowany nie jest unikalny)

    Max_Var_Leaf_Size = Max_Var_Leaf_Size + rozmiar w bajtach kolumn kluczy klastrowania o zmiennej długości, które nie są częścią zestawu nieklastrowanych kolumn kluczy indeksu (+ 4, jeśli indeks klastrowany jest nieunikalny)

  3. Oblicz rozmiar mapy bitowej o wartości null:

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

    Należy użyć tylko części całkowitej poprzedniego wyrażenia. Odrzuć resztę.

  4. Oblicz rozmiar danych o zmiennej długości:

    Jeśli istnieją kolumny o zmiennej długości (kolumny kluczy lub dołączone), w tym wszystkie niezbędne kolumny kluczy klastrowania zgodnie z opisem w kroku 2.2, określ, ile miejsca jest używane do przechowywania kolumn w wierszu indeksu:

    Variable_Leaf_Size = 2 + (Num_Variable_Leaf_Cols x 2) + Max_Var_Leaf_Size

    Bajty dodane do Max_Var_Key_Size służą do śledzenia każdej kolumny zmiennej. W tej formule przyjęto założenie, że wszystkie kolumny o zmiennej długości są pełne o 100%. Jeśli przewidujesz, że zostanie użyty mniejszy procent miejsca do magazynowania w kolumnie o zmiennej długości, możesz dostosować wartość Max_Var_Leaf_Size o ten procent, aby uzyskać dokładniejsze oszacowanie ogólnego rozmiaru tabeli.

    Jeśli nie ma kolumn o zmiennej długości (kolumn kluczy lub dołączonych), ustaw wartość Variable_Leaf_Size na 0.

  5. Oblicz rozmiar wiersza indeksu:

    Leaf_Row_Size = Fixed_Leaf_Size + Variable_Leaf_Size + Leaf_Null_Bitmap + 1 (dla nadmiaru nagłówka wiersza indeksu)

  6. Oblicz liczbę wierszy indeksu na stronę (8096 wolnych bajtów na stronę):

    Leaf_Rows_Per_Page = 8096 / (Leaf_Row_Size + 2)

    Ponieważ wiersze indeksu nie obejmują stron, liczba wierszy indeksu na stronę powinna być zaokrąglona w dół do najbliższego całego wiersza. Wartość 2 w formule odnosi się do wpisu wiersza w tablicy slotów strony.

  7. Oblicz liczbę zarezerwowanych wolnych wierszy na stronę na podstawie określonego współczynnika wypełnienia :.

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

    Współczynnik wypełnienia używany w obliczeniach jest wartością całkowitą zamiast wartością procentową. Ponieważ wiersze nie obejmują stron, liczba wierszy na stronę powinna być zaokrąglona w dół do najbliższego całego wiersza. Wraz ze wzrostem współczynnika wypełnienia więcej danych będzie przechowywanych na każdej stronie i będzie mniej stron. Wartość 2 w formule dotyczy wpisu wiersza w tablicy miejsc strony.

  8. Oblicz liczbę stron wymaganych do przechowywania wszystkich wierszy:

    Num_Leaf_Pages = Num_Rows / (Leaf_Rows_Per_Page - Free_Rows_Per_Page)

    Liczba szacowanych stron powinna być zaokrąglona do najbliższej całej strony.

  9. Oblicz rozmiar indeksu (łączna liczba bajtów na stronę: 8192):

    Leaf_Space_Used = 8192 x Num_Leaf_Pages

Krok 3. Obliczanie miejsca używanego do przechowywania informacji o indeksie na poziomach innych niż liści

Wykonaj następujące kroki, aby oszacować ilość miejsca wymaganego do przechowywania pośrednich i głównych poziomów indeksu. Do wykonania tego kroku będą potrzebne wartości zachowane z kroków 2 i 3.

  1. Oblicz liczbę poziomów niebędących liśćmi w indeksie.

    Poziomy nieliściowe = 1 + log(Index_Rows_Per_Page) (Num_Leaf_Pages / Index_Rows_Per_Page)

    Zaokrągl tę wartość do najbliższej liczby całkowitej. Ta wartość nie zawiera poziomu liści indeksu nieklastrowanego.

  2. Oblicz liczbę stron innych niż liści w indeksie:

    Num_Index_Pages = ∑Level (Num_Leaf_Pages/Index_Rows_Per_Page^Poziom), gdzie 1 <= Poziom <= Poziomy

    Zaokrąglij każdą sumę do najbliższej liczby całkowitej. W prostym przykładzie rozważ indeks, w którym Num_Leaf_Pages = 1000 i Index_Rows_Per_Page = 25. Pierwszy poziom indeksu powyżej poziomu liścia przechowuje 1000 wierszy indeksu, co odpowiada jednemu wierszowi indeksu na stronę liścia, a 25 wierszy indeksów mieści się na stronie. Oznacza to, że do przechowywania tych 1000 wierszy indeksu są wymagane 40 stron. Następny poziom indeksu musi przechowywać 40 wierszy. Oznacza to, że wymaga 2 stron. Końcowy poziom indeksu musi przechowywać 2 wiersze. Oznacza to, że wymaga 1 strony. Daje to 43 strony indeksu nielistego. Gdy te liczby są używane w poprzednich formułach, wynik wygląda następująco:

    Poziomy_nie_liści = 1 + log(25) (1000 / 25) = 3

    Num_Index_Pages = 1000/(25^3)+ 1000/(25^2) + 1000/(25^1) = 1 + 2 + 40 = 43, czyli liczba stron opisanych w przykładzie.

  3. Oblicz rozmiar indeksu (łączna liczba bajtów na stronę: 8192):

    Index_Space_Used = 8192 x Num_Index_Pages

Krok 4. Suma wartości obliczeniowych

Suma wartości uzyskanych z poprzednich dwóch kroków:

Nieklastrowany rozmiar indeksu (bajty) = Leaf_Space_Used + Index_Space_used

To obliczenie nie uwzględnia następujących elementów:

  • Partycjonowanie

    Obciążenie związane z partycjonowaniem jest minimalne, ale złożone do obliczenia. Nie jest ważne, aby uwzględnić.

  • Strony alokacji

    Istnieje co najmniej jedna strona IAM używana do śledzenia stron przydzielonych do sterty, ale obciążenie przestrzeni jest minimalne i nie ma algorytmu deterministycznego obliczania dokładnie liczby stron IAM.

  • Wartości obiektów dużych (LOB)

    Algorytm ustalający dokładnie, ile miejsca będzie używane do przechowywania typów danych LOB varchar(max), varbinary(max), nvarchar(max), text, ntext, xmli image wartości jest złożony. Wystarczy dodać średni rozmiar oczekiwanych wartości LOB, pomnożyć przez Num_Rowsi dodać go do całkowitego nieklastrowanego rozmiaru indeksu.

  • Kompresja

    Nie można wstępnie obliczyć rozmiaru skompresowanego indeksu.

  • Rzadkie kolumny

    Aby uzyskać informacje na temat wymagań dotyczących przestrzeni w kolumnach rozrzedzonych, zobacz Use Sparse Columns.

Zobacz też

Indeksy Klastrowane i Nieklastrowane Opisane
tworzenie indeksów nieklastrowanych
tworzenie indeksów klastrowanych
oszacować rozmiar tabeli
oszacować rozmiar klastrowanego indeksu
Szacowanie rozmiaru sterty
oszacować rozmiar bazy danych