Udostępnij za pomocą


opcja SORT_IN_TEMPDB dla indeksów

Dotyczy:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceBaza danych SQL w usłudze Microsoft Fabric

Podczas tworzenia lub ponownego budowania indeksu, ustawiając opcję SORT_IN_TEMPDB na Włączona, możesz skierować aparat bazy danych SQL Server do użycia tempdb w celu przechowywania pośrednich wyników sortowania, wykorzystywanych do budowania indeksu. Mimo że ta opcja zwiększa ilość tymczasowego miejsca na dysku używanego do utworzenia indeksu, opcja może skrócić czas wymagany do utworzenia lub ponownego skompilowania indeksu, gdy baza danych tempdb znajduje się na zestawie dysków innych niż baza danych użytkownika. Aby uzyskać więcej informacji na temat tempdb, zobacz Konfigurowanie opcji konfiguracji pamięci serwera dla tworzenia indeksu.

Fazy kompilowania indeksów

Gdy aparat bazy danych tworzy indeks, przechodzi przez następujące fazy:

  • Silnik bazy danych najpierw przeszukuje strony danych tabeli podstawowej, aby pobrać wartości kluczy i stworzyć wiersz liściowy indeksu dla każdego wiersza danych. Gdy wewnętrzne bufory sortowania zostały wypełnione wpisami indeksu liściowego, wpisy są sortowane i zapisywane na dysku jako pośredni przebieg sortowania. Silnik bazy danych następnie wznawia skanowanie strony danych, dopóki bufory sortowania ponownie się nie wypełnią. Ten wzorzec skanowania wielu stron danych, po którym następuje sortowanie i zapisywanie przebiegu sortowania, trwa do momentu przetworzenia wszystkich wierszy tabeli bazowej.

    W indeksie klastrowanym wiersze liści indeksu to wiersze danych tabeli; w związku z tym przebiegi sortowania pośredniego zawierają wszystkie wiersze danych. W indeksie nieklastrowanym wiersze liści mogą zawierać kolumny niemające klucza, ale są zazwyczaj mniejsze niż indeks klastrowany. Jeśli klucze indeksu są duże lub w indeksie znajduje się kilka kolumn nienależących do kluczy, przebieg sortowania nieklastrowego może być duży. Aby uzyskać więcej informacji na temat dołączania kolumn innych niż kluczowe, zobacz Create Indexes with Included Columns (Tworzenie indeksów z dołączonymi kolumnami).

  • Silnik bazy danych scala posortowane przebiegi wierszy liściowych indeksu w jeden posortowany strumień. Komponent sortowania przez scalanie silnika bazy danych rozpoczyna się od pierwszej strony każdej operacji sortowania, znajduje najniższy klucz we wszystkich stronach i przekazuje ten wiersz liścia do komponentu tworzenia indeksu. Następny najniższy klucz jest przetwarzany, a następnie następny itd. Gdy ostatni wiersz indeksu liścia zostanie wyodrębniony ze strony przebiegu sortowania, proces zostanie przeniesiony na następną stronę z tego przebiegu sortowania. Po przetworzeniu wszystkich stron w zakresie przebiegu sortowania zakres jest zwalniany. Ponieważ każdy wiersz indeksu liścia jest przekazywany do składnika tworzenia indeksu, znajduje się on na stronie indeksu liścia w buforze. Każda strona liścia jest zapisywana podczas wypełniania. W miarę pisania stron liści aparat bazy danych tworzy również górne poziomy indeksu. Każda strona indeksu najwyższego poziomu jest zapisywana po jej wypełnieniu.

opcja SORT_IN_TEMPDB

Gdy SORT_IN_TEMPDB jest ustawiona na WYŁ., domyślne uruchomienia sortowania są przechowywane w docelowej grupie plików. Podczas pierwszej fazy tworzenia indeksu naprzemienne odczyty stron tabeli podstawowej i zapisy przebiegów sortowania przenoszą głowice odczytu/zapisu dysku z jednego obszaru dysku do innego. Głowice znajdują się w obszarze stron danych podczas skanowania stron danych. Przenoszą się do obszaru wolnego miejsca, gdy bufory sortowania się wypełniają, a bieżący sort musi zostać zapisany na dysku, a następnie powracają do obszaru strony danych, gdy skanowanie strony tabeli zostanie wznowione. Ruch głowy odczytu/zapisu jest większy w drugiej fazie. W tym czasie proces sortowania zazwyczaj polega na naprzemiennym odczytywaniu z każdego segmentu obszaru sortowania. Zarówno przebiegi sortowania, jak i nowe strony indeksu są wbudowane w docelową grupę plików. Oznacza to, że w tym samym czasie silnik bazy danych rozkłada odczyty w różnych przebiegach sortowania, musi okresowo przechodzić do obszarów indeksu, aby zapisywać nowe strony indeksu w miarę ich wypełniania.

Jeśli opcja SORT_IN_TEMPDB jest ustawiona na WŁ., a tempdb znajduje się w osobnym zestawie dysków niż docelowa grupa plików, podczas pierwszej fazy odczyty stron danych odbywają się na innym dysku niż zapisy do obszaru roboczego sortowania w tempdb. Oznacza to, że odczyty dysku dotyczące kluczy danych są generalnie kontynuowane w sposób bardziej szeregowy na dysku, a zapisy na dysku tempdb również zazwyczaj odbywają się szeregowo, podobnie jak zapisy służące do kompilacji końcowego indeksu. Nawet jeśli inni użytkownicy korzystają z bazy danych i uzyskują dostęp do oddzielnych adresów dysków, ogólny wzorzec odczytów i zapisów jest bardziej wydajny, gdy SORT_IN_TEMPDB jest określony niż wtedy, gdy nie jest.

Opcja SORT_IN_TEMPDB może poprawić ciągłość zakresów indeksu, zwłaszcza jeśli operacja CREATE INDEX nie jest przetwarzana równolegle. Zakresy obszaru roboczego sortowania są zwalniane w nieco losowy sposób w odniesieniu do ich lokalizacji w bazie danych. Jeśli obszary robocze sortowania znajdują się w docelowej grupie plików, kiedy zakresy pracy sortowania są zwalniane, mogą być uzyskiwane poprzez żądania przydziału na przechowywanie struktury indeksu podczas jej tworzenia. To może zmienić losowo lokalizacje zakresów indeksu do pewnego stopnia. Jeśli zakresy sortowania są przechowywane oddzielnie w bazie danych tempdb, sekwencja, w której są zwolnione, nie ma wpływu na lokalizację zakresów indeksu. Ponadto, gdy przebiegi sortowania pośredniego są przechowywane w bazie danych tempdb zamiast docelowej grupy plików, w docelowej grupie plików jest dostępnych więcej miejsca. Zwiększa to prawdopodobieństwo, że zakresy indeksu będą ciągłe.

Opcja SORT_IN_TEMPDB ma wpływ tylko na bieżącą instrukcję. Brak rekordów metadanych wskazujących, czy indeks był posortowany w tempdb, czy nie. Jeśli na przykład utworzysz indeks nieklastrowany przy użyciu opcji SORT_IN_TEMPDB, a w późniejszym czasie utwórz indeks klastrowany bez określenia opcji, aparat bazy danych nie używa opcji podczas ponownego tworzenia indeksu nieklastrowanego.

Note

Jeśli operacja sortowania nie jest wymagana lub jeśli sortowanie można wykonać w pamięci, opcja SORT_IN_TEMPDB zostanie zignorowana.

Wymagania dotyczące miejsca na dysku

Po ustawieniu opcji SORT_IN_TEMPDB na WŁĄCZONA, musisz mieć wystarczająco dużo wolnego miejsca na dysku dostępnego w tempdb do przechowywania przebiegów sortowania pośredniego oraz wystarczająco dużo wolnego miejsca na dysku w docelowej grupie plików do przechowywania nowego indeksu. Instrukcja CREATE INDEX kończy się niepowodzeniem, jeśli za mało wolnego miejsca i istnieje pewien powód, dla którego bazy danych nie mogą automatycznie tworzyć większej ilości miejsca, na przykład nie ma miejsca na dysku lub jest wyłączona funkcja automatycznego zwiększania.

Jeśli SORT_IN_TEMPDB jest ustawione na OFF, dostępna przestrzeń na dysku w docelowej grupie plików musi być zbliżona do rozmiaru końcowego indeksu. W pierwszej fazie przebiegi sortowania są kompilowane i wymagają mniej więcej tej samej ilości miejsca co końcowy indeks. W drugiej fazie każdy obszar przebiegu sortowania jest zwalniany po jego przetworzeniu. Oznacza to, że zakresy przebiegów sortowania są zwalniane w podobnym tempie, w którym zakresy są pozyskiwane do przechowywania końcowych stron indeksu; w związku z tym ogólne wymagania dotyczące miejsca nie przekraczają znacznie rozmiaru końcowego indeksu. Jednym z efektów ubocznych jest to, że jeśli ilość wolnego miejsca jest bardzo zbliżona do rozmiaru końcowego indeksu, aparat bazy danych zazwyczaj bardzo szybko ponownie wykorzysta zakresy przebiegów sortowania po ich zwolnieniu. Ponieważ zakresy sortowania są zwalniane w nieco losowy sposób, zmniejsza to spójność zakresów indeksu w tym scenariuszu. Jeśli SORT_IN_TEMPDB jest ustawiona na wartość OFF, poprawia się ciągłość zakresów indeksu, jeżeli w docelowej grupie plików dostępna jest wystarczająca ilość wolnego miejsca, umożliwiająca przydzielenie zakresów indeksu z ciągłej puli zamiast ze świeżo zwolnionych zakresów po uruchomieniu sortowania.

Podczas tworzenia indeksu nieklastrowanego musisz mieć dostęp do wolnego miejsca:

  • Jeśli SORT_IN_TEMPDB jest ustawiona na ON, w tempdb musi być wystarczająco wolnego miejsca, aby przechować sortowania, i wystarczająco wolnego miejsca w docelowej grupie plików, aby przechować ostateczną strukturę indeksu. Przebiegi sortowania zawierają wiersze liściowe indeksu.

  • Jeśli SORT_IN_TEMPDB ma wartość OFF, wolne miejsce w docelowej grupie plików musi być wystarczająco duże, aby przechowywać ostateczną strukturę indeksu. Ciągłość indeksu może zostać ulepszona, jeśli jest dostępna większa ilość wolnego miejsca.

Podczas tworzenia indeksu klastrowanego w tabeli, która nie ma indeksów nieklastrowanych, musisz mieć dostęp do wolnego miejsca:

  • Jeśli SORT_IN_TEMPDB jest ustawione na ON, w bazie danych tempdb musi być wystarczająca ilość wolnego miejsca do przechowywania operacji sortowania. Obejmują one wiersze danych tabeli. W docelowej grupie plików musi być wystarczająca ilość wolnego miejsca do przechowywania ostatecznej struktury indeksu. Obejmuje to wiersze danych tabeli i indeks B-tree. Może być konieczne dostosowanie oszacowania dla czynników, takich jak duży rozmiar klucza lub współczynnik wypełnienia o niskiej wartości.

  • Jeśli SORT_IN_TEMPDB ma wartość OFF, wolne miejsce w docelowej grupie plików musi być wystarczająco duże, aby przechowywać końcową tabelę. Obejmuje to strukturę indeksu. Ciągłość zakresów tabeli i indeksu może zostać ulepszona, jeśli jest dostępna większa ilość wolnego miejsca.

Podczas tworzenia indeksu klastrowanego w tabeli, która ma indeksy nieklastrowane, musi być dostępna wolna przestrzeń.

  • Jeśli SORT_IN_TEMPDB jest ustawiony na WŁĄCZONE, w tempdb musi być wystarczająco dużo wolnego miejsca do przechowywania kolekcji przebiegów sortowań dla największego indeksu, zazwyczaj indeksu klastrowanego, oraz wystarczająco wolnego miejsca w docelowej grupie plików do przechowywania końcowych struktur wszystkich indeksów. Obejmuje to indeks klastrowany zawierający wiersze danych tabeli.

  • Jeśli SORT_IN_TEMPDB ma wartość OFF, wolne miejsce w docelowej grupie plików musi być wystarczająco duże, aby przechowywać końcową tabelę. Obejmuje to struktury wszystkich indeksów. Ciągłość zakresów tabeli i indeksu może zostać ulepszona, jeśli jest dostępna większa ilość wolnego miejsca.

STWÓRZ INDEKS (Transact-SQL)

Reorganizacja i ponowne kompilowanie indeksów

ALTER INDEX (Transact-SQL)

Skonfiguruj opcję konfiguracji serwera dotyczącej pamięci tworzenia indeksu

wymagania dotyczące miejsca na dysku dla operacji DDL indeksu