Szacowanie rozmiaru indeksu klastrowanego
Dotyczy:SQL Server
Azure SQL Database
Azure SQL Managed Instance
SQL Database w Usłudze Microsoft Fabric
Poniższe kroki umożliwiają oszacowanie ilości miejsca wymaganego do przechowywania danych w indeksie klastrowanym:
Oblicz miejsce używane do przechowywania danych na poziomie liści indeksu klastrowanego.
Oblicz miejsce używane do przechowywania informacji o indeksie klastrowanym.
Łączna liczba obliczonych wartości.
Krok 1. Obliczanie miejsca używanego do przechowywania danych na poziomie liścia
Określ liczbę wierszy, które będą obecne w tabeli:
Num_Rows = liczba wierszy w tabeli
Określ liczbę kolumn o stałej długości i zmiennej długości oraz oblicz miejsce wymagane dla ich magazynu:
Oblicz przestrzeń zajmowaną przez każdą z tych grup kolumn w wierszu danych. Rozmiar kolumny zależy od typu danych i specyfikacji długości.
Num_Cols = całkowita liczba kolumn (o stałej długości i zmiennej długości)
Fixed_Data_Size = całkowity rozmiar bajtów wszystkich kolumn o stałej długości
Num_Variable_Cols = liczba kolumn o zmiennej długości
Max_Var_Size = maksymalny rozmiar bajtów wszystkich kolumn o zmiennej długości
Jeśli indeks klastrowany nie jest unikatowy, należy uwzględnić kolumnę unifikatora:
Unikatyfikator to kolumna o zmiennej długości, która może być pusta (null). Będzie miała wartość niezerową i rozmiar 4 bajtów w wierszach, które mają nieunikatowe wartości klucza. Ta wartość jest częścią klucza indeksu i jest wymagana, aby upewnić się, że każdy wiersz ma unikatową wartość klucza.
Num_Cols = Num_Cols + 1
Num_Variable_Cols = Num_Variable_Cols + 1
Max_Var_Size = Max_Var_Size + 4
Te modyfikacje zakładają, że wszystkie wartości nie będą unikatowe.
Część wiersza, znana jako zerowa mapa bitowa, jest zarezerwowana do zarządzania zerowalnością kolumn. Oblicz jego rozmiar:
Null_Bitmap = 2 + ((Num_Cols + 7) / 8)
Należy użyć tylko części całkowitej poprzedniego wyrażenia; odrzuć resztę.
Oblicz rozmiar danych o zmiennej długości:
Jeśli w tabeli znajdują się kolumny o zmiennej długości, określ, ile miejsca jest używane do przechowywania kolumn w wierszu:
Variable_Data_Size = 2 + (Num_Variable_Cols x 2) + Max_Var_Size
Bajty dodane do Max_Var_Size służą do śledzenia każdej kolumny zmiennych. 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_Size o ten procent, aby uzyskać dokładniejsze oszacowanie ogólnego rozmiaru tabeli.
Notatka
Można połączyć varchar, nvarchar, varbinary lub kolumny sql_variant, które powodują, że łączna zdefiniowana szerokość tabeli przekroczy 8060 bajtów. Długość każdej z tych kolumn musi nadal mieścić się w granicach 8000 bajtów dla kolumny varchar, varbinarylub sql_variant, oraz 4000 bajtów dla kolumny nvarchar. Jednak ich połączone szerokości mogą przekraczać limit 8060 bajtów w tabeli.
Jeśli nie ma kolumn o zmiennej długości, ustaw wartość Variable_Data_Size na 0.
Oblicz całkowity rozmiar wiersza:
Row_Size = Fixed_Data_Size + Variable_Data_Size + Null_Bitmap + 4
Wartość 4 to nadmiarowy nagłówek związany z wierszem danych.
Oblicz liczbę wierszy na stronę (8096 wolnych bajtów na stronę):
Rows_Per_Page = 8096 / (Row_Size + 2)
Ponieważ wiersze nie obejmują stron, liczba wierszy na stronę powinna być zaokrąglona w dół do najbliższego całego wiersza. Wartość 2 w formule odnosi się do pozycji wiersza w tablicy gniazd na stronie.
Oblicz liczbę zarezerwowanych wolnych wierszy na stronę, na podstawie współczynnika wypełnienia określonego w:
Free_Rows_Per_Page = 8096 x ((100 - Fill_Factor) / 100) / (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 odnosi się do wpisu wiersza w tablicy slotów strony.
Oblicz liczbę stron wymaganych do przechowywania wszystkich wierszy:
Liczba_Stroniczek = Liczba_Wierszy / (Wiersze_Na_Strone - Wolne_Wiersze_Na_Strone)
Liczba szacowanych stron powinna być zaokrąglona do najbliższej całej strony.
Oblicz ilość miejsca wymaganego do przechowywania danych na poziomie liścia (łącznie 8192 bajty na stronę):
Zużycie_miejsca_arkuszy = 8192 x Liczba_Stronic_Arkuszy
Krok 2. Obliczanie miejsca używanego do przechowywania informacji o indeksie
Poniższe kroki umożliwiają oszacowanie ilości miejsca wymaganego do przechowywania wyższych poziomów indeksu:
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
Uwzględnij identyfikator unikalności, jeśli indeks nie jest unikalny.
Unikalizator to kolumna o zmiennej długości, która może mieć wartość null. Będzie to wartość niepusta i 4 bajty w wierszach, które mają nieunikatowe wartości klucza indeksu. Ta wartość jest częścią klucza indeksu i jest wymagana, aby upewnić się, że każdy wiersz ma unikatową wartość klucza.
Num_Key_Cols = Num_Key_Cols + 1
Num_Variable_Key_Cols = Num_Variable_Key_Cols + 1
Max_Var_Key_Size = Max_Var_Key_Size + 4
Te modyfikacje zakładają, że wszystkie wartości nie będą unikatowe.
Oblicz rozmiar mapy bitowej o wartości null:
Jeśli w kluczu indeksu znajdują się kolumny dopuszczane do wartości null, część wiersza indeksu jest zarezerwowana dla mapy bitowej o wartości null. Oblicz jego rozmiar:
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 mogącego przyjmować wartość null, ustaw wartość Index_Null_Bitmap na 0.
Oblicz rozmiar danych o zmiennej długości:
Jeśli w indeksie znajdują się kolumny o zmiennej długości, 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 o zmiennej długości. 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.
Oblicz rozmiar wiersza indeksu:
Index_Row_Size = Fixed_Key_Size + Variable_Key_Size + Index_Null_Bitmap + 1 (dla nadmiaru nagłówka wiersza indeksu) + 6 (dla wskaźnika identyfikatora ID strony podrzędnej)
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.
Oblicz liczbę poziomów w indeksie:
Poziomy_Nie_Liściowe = 1 + logarytm (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 klastrowanego.
Oblicz liczbę stron innych niż liści w indeksie:
Num_Index_Pages = ∑Level (Num_Leaf_Pages / (Index_Rows_Per_Page^Level))
where 1 <= Level <= Poziomy_nie_liści
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, z których każdy odpowiada jednej stronie liścia, a na jedną stronę mieści się 25 wierszy indeksu. 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 nieliściaste strony indeksu. Gdy te liczby są używane w poprzednich formułach, wynik jest następujący:
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, czyli liczba stron opisanych w przykładzie.
Oblicz rozmiar indeksu (łączna liczba bajtów na stronę: 8192):
Index_Space_Used = 8192 x Num_Index_Pages
Krok 3. Suma wartości obliczeniowych
Suma wartości uzyskanych z poprzednich dwóch kroków:
Rozmiar indeksu klastrowanego (bajty) = Leaf_Space_Used + Index_Space_used
To obliczenie nie uwzględnia następujących elementów:
Partycjonowanie
Narzut przestrzenny związany z partycjonowaniem jest minimalny, ale złożony 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 określający dokładnie, ile miejsca będzie używane do przechowywania typów danych LOB varchar(max), varbinary(max), nvarchar(max), tekst, ntext, xmli image , jest złożony. Wystarczy dodać średni rozmiar oczekiwanych wartości LOB, pomnożyć przez Num_Rowsi dodać go do łącznego rozmiaru indeksu klastrowanego.
Kompresja
Nie można wstępnie obliczyć rozmiaru skompresowanego indeksu.
Kolumny rzadkie
Aby uzyskać informacje na temat wymagań dotyczących przestrzeni w rzadkich kolumnach, zobacz Use Sparse Columns.