- 03/19/2020
- 21 minutes to read
-
- p
- j
- M
- M
- d
-
+11
Applies to: SQL Server (Wszystkie obsługiwane wersje) Azure SQL Database Azure SQL Managed Instance Azure Synapse Analytics Parallel Data Warehouse
w tym artykule opisano sposób defragmentacji indeksu i omówiono jej wpływ na wydajność zapytań. Po określeniu stopnia fragmentacji indeksu można go defragmentować, reorganizując indeks lub odbudowując go, uruchamiając polecenia Transact-SQL w wybranym narzędziu lub używając SQL Server Management Studio.
przegląd fragmentacji indeksu
czym jest fragmentacja indeksu i dlaczego powinno mnie to obchodzić:
- fragmentacja istnieje, gdy indeksy mają strony, w których logiczne uporządkowanie w indeksie, oparte na wartości klucza indeksu, nie pasuje do fizycznego uporządkowania wewnątrz stron indeksu.
- silnik bazy danych automatycznie modyfikuje indeksy za każdym razem, gdy wykonywane są operacje wstawiania, aktualizacji lub usuwania danych bazowych. Na przykład dodanie wierszy w tabeli może spowodować podział istniejących stron w indeksach rowstore, aby zrobić miejsce na wstawianie nowych wartości kluczy. Z biegiem czasu te modyfikacje mogą spowodować rozproszenie informacji w indeksie w bazie danych (fragmentacja). Fragmentacja występuje, gdy indeksy mają strony, w których logiczna kolejność, oparta na wartości klucza, nie pasuje do fizycznej kolejności wewnątrz pliku danych.
- mocno pofragmentowane indeksy mogą obniżyć wydajność zapytań, ponieważ do zlokalizowania danych, na które wskazuje indeks, wymagane są dodatkowe wejścia / Wyjścia. Większa liczba operacji We / Wy powoduje, że aplikacja reaguje powoli, szczególnie w przypadku operacji skanowania.
wykrywanie stopnia fragmentacji
pierwszym krokiem w podejmowaniu decyzji, którą metodę defragmentacji indeksu należy zastosować, jest analiza indeksu w celu określenia stopnia fragmentacji. Wykrywa się fragmentację w różny sposób dla indeksów rowstore i columnstore.
Uwaga
szczególnie ważne jest przeglądanie fragmentacji indeksu lub sterty po usunięciu dużych ilości danych. W przypadku stosów, jeśli występują częste aktualizacje, może być również konieczne sprawdzenie fragmentacji, aby uniknąć rozprzestrzeniania się przekazywanych rekordów. Aby uzyskać więcej informacji na temat stosów, zobacz Heaps (tabele bez grupowanych indeksów).
wykrywanie fragmentacji indeksów rowstore
za pomocą sys.dm_db_index_physical_stats, możesz wykryć fragmentację w określonym indeksie, wszystkie indeksy w tabeli lub widoku indeksowanym, wszystkie indeksy w bazie danych lub wszystkie indeksy we wszystkich bazach danych. Dla indeksów partycjonowanych, sys. dm_db_index_physical_stats dostarcza również informacji o fragmentacji dla każdej partycji.
zbiór wyników zwracany przez sys. dm_db_index_physical_stats zawiera następujące kolumny:
Kolumna | opis | |
---|---|---|
avg_fragmentation_in_percent | procent fragmentacji logicznej (strony pozakładowe w indeksie). | |
fragment_count | liczba fragmentów (fizycznie następujących po sobie stron liści) w indeksie. | |
avg_fragment_size_in_pages | średnia liczba stron w jednym fragmencie w indeksie. |
avg_fragmentation_in_percent value | Corrective statement |
---|---|
> 5% and < = 30% 1 | ALTER INDEX REORGANIZE |
> 30% 1 | ALTER INDEX REBUILD WITH (ONLINE = ON) 2 |
1 These values provide a rough guideline for determining the point at which you should switch between ALTER INDEX REORGANIZE
I ALTER INDEX REBUILD
. Jednak rzeczywiste wartości mogą się różnić w zależności od przypadku. Ważne jest, aby eksperymentować, aby określić najlepszy próg dla środowiska.
Tip
na przykład, jeśli dany indeks jest używany głównie do operacji skanowania, usunięcie fragmentacji może poprawić wydajność tych operacji. Korzyść z wydajności może nie być zauważalna dla indeksów, które są używane głównie do wyszukiwania operacji.
podobnie, usuwanie fragmentacji w stercie (tabeli bez grupowanego indeksu) jest szczególnie przydatne w operacjach skanowania indeksu bez grupowania, ale ma niewielki wpływ w operacjach wyszukiwania.
2 odbudowa indeksu może być wykonana online lub offline. Reorganizacja indeksu jest zawsze wykonywana online. Aby uzyskać dostępność podobną do opcji reorganizacja, należy przebudować indeksy online. Aby uzyskać więcej informacji, zobacz indeksowanie i wykonywanie operacji indeksowania Online.
Indeksy z fragmentacją mniejszą niż 5 procent nie muszą być defragmentowane, ponieważ korzyści z usunięcia tak małej fragmentacji są prawie zawsze znacznie przewyższane przez koszt procesora poniesiony na reorganizację lub odbudowę indeksu. Ponadto przebudowa lub reorganizacja małych indeksów rowstore na ogół nie zmniejsza faktycznej fragmentacji.Do SQL Server 2014 włącznie (12.X), silnik bazy danych SQL Server przydziela przestrzeń przy użyciu mieszanych zakresów. Dlatego strony o małych indeksach są czasami przechowywane w mieszanym zakresie. Mieszane zakresy są współdzielone przez maksymalnie osiem obiektów, więc fragmentacja w małym indeksie może nie zostać zmniejszona po reorganizacji lub przebudowie. Zobacz także rozważania specyficzne dla przebudowywania indeksów rowstore. Aby uzyskać więcej informacji na temat rozszerzeń, zobacz Przewodnik po architekturze stron i rozszerzeń.
wykrywanie fragmentacji indeksów columnstore
za pomocą sys.dm_db_column_store_row_group_physical_stats można określić procent usuniętych wierszy w indeksie, co jest rozsądną miarą fragmentacji w grupie wierszy indeksu columnstore. Użyj tych informacji, aby obliczyć fragmentację określonego indeksu, wszystkich indeksów w tabeli, wszystkich indeksów w bazie danych lub wszystkich indeksów we wszystkich bazach danych.
zestaw wyników zwracany przez sys.dm_db_column_store_row_group_physical_stats zawiera następujące kolumny:
Kolumna | opis |
---|---|
total_rows | liczba fizycznych wierszy przechowywanych w grupie wierszy. W przypadku skompresowanych grup wierszy obejmuje to wiersze oznaczone jako usunięte. |
deleted_rows | Liczba wierszy fizycznie przechowywanych w skompresowanej grupie wierszy, które są oznaczone do usunięcia. 0 dla grup wierszy znajdujących się w sklepie delta. |
użyj tych informacji zwróconych do obliczenia fragmentacji indeksu za pomocą poniższego wzoru:
100*(ISNULL(deleted_rows,0))/NULLIF(total_rows,0)
po rozpoznaniu stopnia fragmentacji indeksu, użyj poniższej tabeli, aby określić najlepszą metodę usuwania fragmentacji: reorganizacja indeksu lub indeks.
computed fragmentation in percent value | Applies to version | Corrective statement |
---|---|---|
> = 20% | SQL Server 2012 (11.x) and SQL Server 2014 (12.x) | ALTER INDEX REBUILD |
> = 20% | Starting with SQL Server 2016 (13.x) | ALTER INDEX reorganizacja |
aby sprawdzić fragmentację indeksu rowstore za pomocą Transact-SQL
poniższy przykład znajduje średni procent fragmentacji wszystkich indeksów w HumanResources.Employee
tabela w bazieAdventureWorks2016
.
SELECT a.object_id, object_name(a.object_id) AS TableName, a.index_id, name AS IndedxName, avg_fragmentation_in_percentFROM sys.dm_db_index_physical_stats (DB_ID (N'AdventureWorks2016_EXT') , OBJECT_ID(N'HumanResources.Employee') , NULL , NULL , NULL) AS aINNER JOIN sys.indexes AS b ON a.object_id = b.object_id AND a.index_id = b.index_id;GO
poprzednie polecenie zwraca wynik podobny do następującego.
object_id TableName index_id IndexName avg_fragmentation_in_percent----------- ------------ ----------- ----------------------------------------------------- ------------------------------1557580587 Employee 1 PK_Employee_BusinessEntityID 01557580587 Employee 2 IX_Employee_OrganizationalNode 01557580587 Employee 3 IX_Employee_OrganizationalLevel_OrganizationalNode 01557580587 Employee 5 AK_Employee_LoginID 66.66666666666671557580587 Employee 6 AK_Employee_NationalIDNumber 501557580587 Employee 7 AK_Employee_rowguid 0(6 row(s) affected)
aby uzyskać więcej informacji, zobacz sys.dm_db_index_physical_stats.
aby sprawdzić fragmentację indeksu columnstore za pomocą Transact-SQL
poniższy przykład znajduje średni procent fragmentacji wszystkich indeksów wdbo.FactResellerSalesXL_CCI
tabeli wAdventureWorksDW2016
bazie danych.
SELECT i.object_id, object_name(i.object_id) AS TableName, i.index_id, i.name AS IndexName, 100*(ISNULL(SUM(CSRowGroups.deleted_rows),0))/NULLIF(SUM(CSRowGroups.total_rows),0) AS 'Fragmentation'FROM sys.indexes AS i INNER JOIN sys.dm_db_column_store_row_group_physical_stats AS CSRowGroups ON i.object_id = CSRowGroups.object_id AND i.index_id = CSRowGroups.index_idWHERE object_name(i.object_id) = 'FactResellerSalesXL_CCI'GROUP BY i.object_id, i.index_id, i.nameORDER BY object_name(i.object_id), i.name;
poprzednie polecenie zwraca wynik podobny do następującego.
object_id TableName index_id IndexName Fragmentation----------- --------------------------- ----------- ------------------------------- ---------------114099447 FactResellerSalesXL_CCI 1 IndFactResellerSalesXL_CCI 0(1 row(s) affected)
Sprawdź fragmentację indeksu za pomocą SQL Server Management Studio
Uwaga
Management Studio nie może być używane do obliczania fragmentacji indeksów columnstore w SQL Server i nie może być używane do obliczania fragmentacji żadnych indeksów w Azure SQL Database. Użyj poprzedniego przykładu Transact – SQL.
- w Eksploratorze obiektów rozwiń bazę danych zawierającą tabelę, na której chcesz sprawdzić fragmentację indeksu.
- rozwiń folder tabele.
- rozwiń tabelę, na której chcesz sprawdzić fragmentację indeksu.
- rozwiń folder indeksy.
- kliknij prawym przyciskiem myszy indeks, którego chcesz sprawdzić fragmentację i wybierz Właściwości.
- w obszarze Wybierz stronę wybierz fragmentację.
na stronie fragmentacji dostępne są następujące informacje:
wartość | opis |
---|---|
pełność strony | wskazuje średnią pełność stron indeksu, wyrażoną w procentach. 100% oznacza, że strony indeksu są całkowicie zapełnione. 50% oznacza, że średnio każda strona indeksu jest w połowie pełna. |
fragmentacja całkowita | procent fragmentacji logicznej. Oznacza to liczbę stron w indeksie, które nie są przechowywane w kolejności. |
Średnia wielkość rzędu | średnia wielkość rzędu na poziomie liścia. |
głębokość | liczba poziomów w indeksie, w tym poziom liścia. |
przekazywanie rekordów | liczba rekordów w stercie, które mają przekierowujące wskaźniki do innej lokalizacji danych. (Ten stan występuje podczas aktualizacji, gdy nie ma wystarczającej ilości miejsca na przechowywanie nowego wiersza w oryginalnej lokalizacji.) |
wiersze duchów | liczba wierszy oznaczonych jako usunięte, ale jeszcze nie usuniętych. Wiersze te zostaną usunięte przez wątek CZYSZCZENIA, gdy serwer nie jest zajęty. Wartość ta nie obejmuje wierszy, które są zatrzymywane z powodu zaległej transakcji izolacji migawek. |
typ indeksu | typ indeksu. Możliwe wartości to Clustered index, NONCLUSTERED index i Primary XML. Tabele można również zapisywać jako stertę (bez indeksów), ale wtedy nie można otworzyć tej strony właściwości indeksu. |
wiersze na poziomie liści | liczba wierszy na poziomie liści. |
maksymalny rozmiar wiersza | maksymalny rozmiar wiersza na poziomie liści. |
minimalny rozmiar wiersza | minimalny rozmiar wiersza na poziomie liścia. |
strony | całkowita liczba stron danych. |
identyfikator partycji | identyfikator partycji b-drzewa zawierającego indeks. |
Wersja wiersze duchów | liczba rekordów duchów, które są zatrzymywane ze względu na wyjątkową transakcję izolacji migawek. |
Defragmentacja indeksów poprzez przebudowę lub reorganizację indeksu
defragmentujesz fragmentowany indeks przy użyciu jednej z następujących metod:
- reorganizacja indeksu
- przebudowa indeksu
Uwaga
w przypadku Indeksów partycjonowanych zbudowanych na schemacie partycji można użyć jednej z poniższych metod na pełnym indeksie lub pojedynczej partycji indeksu.
reorganizacja indeksu
reorganizacja indeksu wymaga minimalnych zasobów systemowych i jest operacją online. Oznacza to, że długoterminowe blokady tabel blokujących nie są zatrzymywane, a zapytania lub aktualizacje do tabeli bazowej mogą być kontynuowane podczas transakcji ALTER INDEX REORGANIZE
.
-
w przypadku Indeksów rowstore silnik bazy danych defragmentuje poziom liścia indeksów klastrowych i nieklastrowych w tabelach i widokach, fizycznie zmieniając kolejność stron na poziomie liścia, aby dopasować logiczną kolejność węzłów liścia (od lewej do prawej). Reorganizacja powoduje również kompresję stron indeksu na podstawie wartości współczynnika wypełnienia indeksu. Aby wyświetlić ustawienie współczynnika wypełnienia, użyj sys.indeksy. Przykłady składni można znaleźć w przykładach: rowstore reorganize.
-
podczas korzystania z indeksów columnstore, magazyn delta może skończyć się wieloma małymi grupami wierszy po wstawieniu, aktualizacji i usunięciu danych w czasie. Reorganizacja indeksu magazynu kolumn wymusza przeniesienie wszystkich grup wierszy do magazynu kolumn, a następnie łączy grupy wierszy w mniej grup wierszy z większą liczbą wierszy. Operacja reorganizacja usuwa również wiersze, które zostały usunięte z magazynu kolumn. Reorganizacja początkowo wymaga dodatkowych zasobów procesora do kompresji danych, co może spowolnić ogólną wydajność systemu. Jednak po skompresowaniu danych wydajność zapytań poprawia się. Przykłady składni: reorganizacja magazynu kolumn.
odbudowa indeksu
odbudowa indeksu spada i ponownie tworzy indeks. W zależności od rodzaju wersji silnika indeksu i bazy danych, operacja odbudowy może być wykonana online lub offline. Dla składni T-SQL, zobacz ALTER INDEX REBUILD
-
dla indeksów rowstore, odbudowa usuwa fragmentację, odzyskuje miejsce na dysku przez zagęszczanie stron w oparciu o określone lub istniejące ustawienie współczynnika wypełnienia i zmienia kolejność wierszy indeksu na sąsiadujących stronach. Gdy podano
ALL
, wszystkie indeksy w tabeli są usuwane i przebudowywane w jednej transakcji. Ograniczenia dotyczące kluczy obcych nie muszą być z góry odrzucane. Gdy indeksy o zasięgu 128 lub większym są przebudowywane, silnik bazy danych odkłada rzeczywiste dealokacje stron i związane z nimi blokady do czasu zatwierdzenia transakcji. Przykłady składni można znaleźć w przykładach: rowstore reorganize. -
w przypadku Indeksów magazynu kolumn odbudowa usuwa fragmentację, przenosi wszystkie wiersze do magazynu kolumn i odzyskuje miejsce na dysku, fizycznie usuwając wiersze, które zostały logicznie usunięte z tabeli.
Wskazówka
począwszy od SQL Server 2016 (13.x), przebudowa indeksu columnstore zwykle nie jest potrzebna, ponieważ
REORGANIZE
wykonuje podstawowe funkcje przebudowy w tle jako operację online.aby zapoznać się z przykładami składni, zobacz Przykłady: columnstore rebuild.
uprawnienia
wymaga ALTER
uprawnień do tabeli lub widoku. Użytkownik musi być członkiem co najmniej jednej z następujących ról:
- db_ddladmin rola bazy danych 1
- db_owner rola bazy danych
- rola serwera SYSADMIN
1db_ddladmin rola bazy danych jest najmniej uprzywilejowana.
Usuń fragmentację za pomocą SQL Server Management Studio
aby zreorganizować lub odbudować indeks
- w Eksploratorze obiektów rozwiń bazę danych zawierającą tabelę, w której chcesz zreorganizować indeks.
- rozwiń folder tabele.
- rozwiń tabelę, na której chcesz zreorganizować indeks.
- rozwiń folder indeksy.
- kliknij prawym przyciskiem myszy indeks, który chcesz zreorganizować, i wybierz Zreorganizuj.
- w oknie dialogowym Reorganizuj indeksy sprawdź, czy prawidłowy indeks znajduje się w siatce indeksów do reorganizacji i kliknij OK.
- zaznacz pole wyboru Compact large object column data, aby określić, że wszystkie strony zawierające dane dużego obiektu (LOB) również zostaną skompresowane.
- kliknij OK.
aby zreorganizować wszystkie indeksy w tabeli
- w Eksploratorze obiektów, rozwiń bazę danych zawierającą tabelę, w której chcesz zreorganizować indeksy.
- rozwiń folder tabele.
- rozwiń tabelę, na której chcesz przeorganizować indeksy.
- kliknij prawym przyciskiem myszy folder Indeksy i wybierz Zreorganizuj wszystko.
- w oknie dialogowym Reorganizuj indeksy sprawdź, czy właściwe indeksy znajdują się w indeksach, które mają być reorganizowane. Aby usunąć Indeks z siatki indeksów, które mają być reorganizowane, wybierz indeks, a następnie naciśnij klawisz Delete.
- zaznacz pole wyboru Compact large object column data, aby określić, że wszystkie strony zawierające dane dużego obiektu (LOB) również zostaną skompresowane.
- kliknij OK.
aby odbudować indeks
- w Eksploratorze obiektów, rozwiń bazę danych zawierającą tabelę, w której chcesz zreorganizować indeks.
- rozwiń folder tabele.
- rozwiń tabelę, na której chcesz zreorganizować indeks.
- rozwiń folder indeksy.
- kliknij prawym przyciskiem myszy indeks, który chcesz zreorganizować i wybierz opcję Odbuduj.
- w oknie dialogowym Przebuduj indeksy sprawdź, czy prawidłowy indeks znajduje się w siatce indeksów do odbudowania i kliknij OK.
- zaznacz pole wyboru Compact large object column data, aby określić, że wszystkie strony zawierające dane dużego obiektu (LOB) również zostaną skompresowane.
- kliknij OK.
Usuń fragmentację za pomocą Transact-SQL
Uwaga
więcej przykładów na temat używania Transact-SQL do odbudowy lub reorganizacji indeksów można znaleźć w artykule ALTER INDEX Examples: Columnstore Indexes oraz Alter INDEX Examples: Rowstore Indexes.
aby zreorganizować fragmentaryczny indeks
poniższy przykład reorganizuje indeksIX_Employee_OrganizationalLevel_OrganizationalNode
w tabeliHumanResources.Employee
w bazieAdventureWorks2016
.
ALTER INDEX IX_Employee_OrganizationalLevel_OrganizationalNode ON HumanResources.Employee REORGANIZE;
poniższy przykład reorganizuje indeks kolumnIndFactResellerSalesXL_CCI
w tabelidbo.FactResellerSalesXL_CCI
w bazie danychAdventureWorksDW2016
.
-- This command will force all CLOSED and OPEN rowgroups into the columnstore.ALTER INDEX IndFactResellerSalesXL_CCI ON FactResellerSalesXL_CCI REORGANIZE WITH (COMPRESS_ALL_ROW_GROUPS = ON);
aby zreorganizować wszystkie indeksy w tabeli
poniższy przykład reorganizuje wszystkie indeksy w bazieHumanResources.Employee
tabeli w bazieAdventureWorks2016
.
ALTER INDEX ALL ON HumanResources.Employee REORGANIZE;
aby odbudować fragmentaryczny indeks
poniższy przykład odbudowuje pojedynczy indeks w tabeliEmployee
w bazieAdventureWorks2016
.
ALTER INDEX PK_Employee_BusinessEntityID ON HumanResources.EmployeeREBUILD;
aby odbudować wszystkie indeksy w tabeli
poniższy przykład odbudowuje wszystkie indeksy związane z tabelą w bazie danychAdventureWorks2016
za pomocą słowa kluczowegoALL
. Określono trzy opcje.
ALTER INDEX ALL ON Production.ProductREBUILD WITH (FILLFACTOR = 80, SORT_IN_TEMPDB = ON, STATISTICS_NORECOMPUTE = ON);
aby uzyskać więcej informacji, zobacz ALTER INDEX (Transact-SQL).
Automatyczne zarządzanie indeksami i statystykami
wykorzystuje rozwiązania takie jak Adaptive Index Defrag do automatycznego zarządzania defragmentacją indeksów i aktualizacjami statystyk dla jednej lub więcej baz danych. Ta procedura automatycznie wybiera, czy odbudować lub zreorganizować indeks zgodnie z jego poziomem fragmentacji, między innymi parametrami, i aktualizuje statystyki za pomocą progu liniowego.
rozważania specyficzne dla przebudowy indeksów rowstore
przebudowa indeksu klastrowego automatycznie odbudowuje dowolny indeks nieklustrowany, który odwołuje się do klucza klastrowego, jeśli fizyczne lub logiczne identyfikatory zawarte w rekordach indeksu nieklusterowanego wymagają zmiany.
następujące scenariusze wymuszają automatyczne przebudowanie wszystkich indeksów nieklusterowanych w tabeli:
- tworzenie indeksu klastrowego w tabeli
- usuwanie indeksu klastrowego, co powoduje, że tabela jest przechowywana jako sterta
- zmiana klucza klastrowego na dołączanie lub wykluczanie kolumn
następujące scenariusze nie wymagają automatycznego odbudowywania wszystkich indeksów nieklastrowych w magazynie wierszy:
- przebudowa unikalnego indeksu klastrowego
- przebudowa niestandardowego indeksu klastrowego
- zmiana schematu indeksu, na przykład zastosowanie schematu partycjonowania do indeksu klastrowego lub przeniesienie indeksu klastrowego do innej grupy plików
ważne
indeks nie może zostać zreorganizowany ani odbudowany, jeśli grupa plików, w której się znajduje, jest offline lub ustawiona na tylko do odczytu. Gdy podano słowo kluczowe ALL I jeden lub więcej indeksów znajduje się w grupie plików offline lub tylko do odczytu, polecenie nie powiedzie się.
podczas gdy następuje przebudowa indeksu, nośnik fizyczny musi mieć wystarczająco dużo miejsca na przechowywanie dwóch kopii indeksu. Po zakończeniu przebudowy silnik bazy danych usuwa oryginalny indeks.
gdyALL
jest określony za pomocą poleceniaALTER INDEX
, indeksy relacyjne, zarówno grupowane, jak i nieklusterowane, oraz indeksy XML w tabeli są reorganizowane.
uwagi dotyczące przebudowy indeksu magazynu kolumn
podczas przebudowy indeksu magazynu kolumn silnik bazy danych odczytuje wszystkie dane z oryginalnego indeksu magazynu kolumn, w tym ze sklepu delta. Łączy dane w nowe grupy wierszy i kompresuje je do magazynu kolumn. Silnik bazy danych defragmentuje magazyn kolumn, fizycznie usuwając wiersze, które zostały logicznie usunięte z tabeli. Usunięte bajty są odzyskiwane na dysku.
Uwaga
reorganizacja indeksu magazynu kolumn za pomocą Management Studio połączy skompresowane grupy wierszy razem, ale nie wymusi skompresowania wszystkich grup wierszy do magazynu kolumn. Zamknięte grupy wierszy zostaną skompresowane, ale otwarte grupy wierszy nie zostaną skompresowane do columnstore.To przymusowo skompresuj Wszystkie grupy wierszy, użyj poniższego przykładu Transact-SQL.
Uwaga
począwszy od SQL Server 2019 (15.x), tuple-mover jest wspomagany przez zadanie scalania w tle, które automatycznie kompresuje mniejsze otwarte grupy wierszy delta, które istniały od jakiegoś czasu zgodnie z wewnętrznym progiem, lub Scala skompresowane grupy wierszy, z których duża liczba wierszy została usunięta. Poprawia to jakość indeksu columnstore z czasem.
Aby uzyskać więcej informacji o terminach i pojęciach columnstore, zobacz indeksy Columnstore: przegląd.
odbudowanie partycji zamiast całej tabeli
- odbudowanie całej tabeli zajmuje dużo czasu, jeśli indeks jest duży i wymaga wystarczającej ilości miejsca na dysku, aby przechowywać dodatkową kopię indeksu podczas odbudowy. Zwykle konieczne jest tylko odbudowanie ostatnio używanej partycji.
- w przypadku tabel partycjonowanych nie trzeba przebudowywać całego indeksu columnstore, ponieważ fragmentacja może wystąpić tylko w partycjach, które zostały Ostatnio zmodyfikowane. Tabele faktów i tabele dużych wymiarów są zwykle partycjonowane w celu wykonywania operacji tworzenia kopii zapasowych i zarządzania na fragmentach tabeli.
odbudowa partycji po ciężkich operacjach DML
odbudowa partycji defragmentuje partycję i zmniejsza pamięć dyskową. Przebudowa usuwa wszystkie wiersze ze sklepu kolumn, które są oznaczone do usunięcia i przenosi wszystkie grupy wierszy ze sklepu delta do magazynu kolumn. W sklepie delta może być wiele grup wierszy, które mają mniej niż milion wierszy.
odbudowa partycji po wczytaniu danych
odbudowa partycji po wczytaniu daty zapewnia zapisanie wszystkich danych w magazynie kolumn. Gdy współbieżne przetwarzanie każdego obciążenia mniej niż 100 000 wierszy na tej samej partycji w tym samym czasie, partycja może skończyć się wieloma magazynami delta. Przebudowa przenosi wszystkie wiersze magazynu delta do magazynu kolumnowego.
uwagi dotyczące reorganizacji indeksu magazynu kolumn
podczas reorganizacji indeksu magazynu kolumn silnik bazy danych kompresuje każdą zamkniętą grupę wierszy delta do magazynu kolumn jako skompresowaną grupę wierszy. Począwszy od SQL Server 2016 (13.X) oraz w usłudze Azure SQL Database polecenie REORGANIZE
wykonuje następujące dodatkowe optymalizacje defragmentacji online:
-
fizycznie usuwa wiersze z grupy wierszy, gdy logicznie usuwa 10% lub więcej wierszy. Usunięte bajty są odzyskiwane na nośniku fizycznym. Na przykład, jeśli skompresowana Grupa wierszy zawierająca 1 milion wierszy ma usunięte 100 000 wierszy, SQL Server usunie usunięte wiersze i przekompresuje grupę wierszy z 900 000 wierszy. Zapisuje na pamięci, usuwając usunięte wiersze.
-
łączy jedną lub więcej skompresowanych grup wierszy, aby zwiększyć wiersze na Grupę wierszy do maksimum 1 048 576 wierszy. Na przykład, jeśli importujesz zbiorczo 5 partii po 102 400 wierszy, otrzymasz 5 skompresowanych grup wierszy. Jeśli uruchomisz reorganizację, te grupy wierszy zostaną scalone w 1 skompresowaną grupę wierszy o rozmiarze 512 000 wierszy. Zakłada to, że nie było rozmiaru słownika ani ograniczeń pamięci.
-
dla grup wierszy, w których 10% lub więcej wierszy zostało logicznie usuniętych, silnik bazy danych próbuje połączyć tę grupę wierszy z jedną lub większą liczbą grup wierszy. Na przykład, Grupa 1 jest skompresowana z 500 000 wierszy, a grupa 21 jest skompresowana z maksymalnie 1 048 576 wierszy. Rowgroup 21 mA 60% usuniętych wierszy, co pozostawia 409 830 wierszy. Silnik bazy danych sprzyja połączeniu tych dwóch grup wierszy w celu skompresowania nowej grupy wierszy, która ma 909 830 wierszy.
Po wykonaniu wczytywania danych, możesz mieć wiele małych grup wierszy w sklepie delta. Możesz użyć ALTER INDEX REORGANIZE
, aby zmusić wszystkie grupy wierszy do magazynu kolumn, a następnie połączyć grupy wierszy w mniej grup wierszy z większą liczbą wierszy. Operacja reorganizacja usunie również wiersze, które zostały usunięte z magazynu kolumn.
ograniczenia i ograniczenia
indeksy Rowstore o ponad 128 zakresach są przebudowywane w dwóch oddzielnych fazach: logicznym i fizycznym. W fazie logicznej istniejące jednostki alokacji używane przez indeks są oznaczane do dealokacji, wiersze danych są kopiowane i sortowane, a następnie przenoszone do nowych jednostek alokacji utworzonych w celu przechowywania przebudowanego indeksu. W fazie fizycznej jednostki alokacji wcześniej oznaczone do dealokacji są fizycznie odrzucane w krótkich transakcjach, które zdarzają się w tle i nie wymagają wielu blokad. Aby uzyskać więcej informacji na temat zakresu, zobacz strony i przewodnik po architekturze zakresu.
polecenieALTER INDEX REORGANIZE
wymaga, aby plik danych zawierający indeks miał wolne miejsce, ponieważ operacja może przydzielić tymczasowe strony robocze tylko do tego samego pliku, a nie do innego pliku w grupie plików. Tak więc chociaż grupa plików może mieć wolne strony, użytkownik nadal może napotkać błąd 1105: Could not allocate space for object '###' in database '###' because the '###' filegroup is full. Create disk space by deleting unneeded files, dropping objects in the filegroup, adding additional files to the filegroup, or setting autogrowth on for existing files in the filegroup.
Ostrzeżenie
Tworzenie i przebudowa niealaryzowanych indeksów na tabeli z więcej niż 1000 partycji jest możliwe, ale nie jest obsługiwane. Może to spowodować pogorszenie wydajności lub nadmierne zużycie pamięci podczas tych operacji. Microsoft zaleca używanie tylko wyrównanych indeksów, gdy liczba partycji przekracza 1000.
indeks nie może zostać zreorganizowany ani odbudowany, jeśli grupa plików, w której się znajduje, jest offline lub ustawiona na tylko do odczytu. Gdy podano słowo kluczowe ALL
I jeden lub więcej indeksów znajduje się w grupie plików offline lub tylko do odczytu, polecenie nie powiedzie się.
statystyki:
-
gdy indeks jest tworzony lub przebudowywany, Statystyki są tworzone lub aktualizowane przez skanowanie wszystkich wierszy w tabeli. Jednak począwszy od SQL Server 2012 (11.x), statystyki nie są tworzone ani aktualizowane przez skanowanie wszystkich wierszy w tabeli podczas tworzenia lub przebudowywania partycjonowanego indeksu. Zamiast tego Optymalizator zapytań wykorzystuje domyślny algorytm próbkowania do generowania tych statystyk. Aby uzyskać statystyki indeksów partycjonowanych poprzez skanowanie wszystkich wierszy w tabeli, użyj opcji Utwórz statystyki lub zaktualizuj statystyki za pomocą klauzuli
FULLSCAN
. -
gdy indeks jest reorganizowany, statystyki nie są aktualizowane.
indeks nie może zostać zreorganizowany, gdy ALLOW_PAGE_LOCKS
jest ustawione na OFF.
do SQL Server 2017 (14.x), przebudowa indeksu clustered columnstore jest operacją offline. Silnik bazy danych musi uzyskać wyłączną blokadę na stole lub partycji podczas odbudowy. Dane są nieaktywne i niedostępne podczas odbudowy, nawet przy użyciu NOLOCK
, Read-committed Snapshot Isolation (RCSI) lub Snapshot Isolation.Począwszy od SQL Server 2019 (15.x), indeks clustered columnstore można przebudować za pomocą opcjiONLINE = ON
.
w przypadku tabeli usługi Azure Synapse Analytics (dawniej Azure Synapse Analytics) z uporządkowanym indeksem columnstore, ALTER INDEX REBUILD
ponownie posortuje dane za pomocą TempDB. Monitorowanie TempDB podczas operacji odbudowy. Jeśli potrzebujesz więcej miejsca na TempDB, skaluj hurtownię danych. Przeskaluj w dół po zakończeniu odbudowy indeksu.
w przypadku tabeli usługi Azure Synapse Analytics (dawniej usługi Azure Synapse Analytics) z uporządkowanym indeksem columnstore, ALTER INDEX REORGANIZE
nie sortuje ponownie danych. Aby odwołać dane użyj ALTER INDEX REBUILD
.
Używanie funkcji INDEX REBUILD do odzyskiwania danych po awariach sprzętu
we wcześniejszych wersjach serwera SQL Server można czasami odbudować nieklustrowany indeks rowstore, aby skorygować niespójności spowodowane awariami sprzętu.Począwszy od SQL Server 2008, nadal możesz być w stanie naprawić takie niespójności między indeksem a indeksem klastrowym, przebudowując indeks nieklustrowany w trybie offline. Nie można jednak naprawić nieklustrowanych niespójności indeksów, odbudowując indeks online, ponieważ mechanizm odbudowy online wykorzystuje istniejący nieklustrowany indeks jako podstawę do odbudowy, a tym samym utrzymuje niespójność. Przebudowa indeksu w trybie offline może czasami wymusić skanowanie skumulowanego indeksu (lub sterty) i w ten sposób usunąć niespójność. Aby zapewnić odbudowę z indeksu grupowego, upuść i odtwórz indeks nieklustrowany. Podobnie jak w przypadku wcześniejszych wersji, zalecamy odzyskanie niespójności poprzez przywrócenie danych z kopii zapasowej; jednak może być możliwe naprawienie niespójności indeksu poprzez przebudowanie indeksu nieklustrowanego w trybie offline. Więcej informacji: DBCC CHECKDB (Transact-SQL).
Zobacz również
- Przewodnik po architekturze i projektowaniu indeksu SQL Server
- wykonuj operacje indeksowe Online
- ALTER INDEX (Transact-SQL)
- Adaptive Index Defrag
- tworzenie statystyk (Transact-SQL)
- aktualizacja statystyk (Transact-SQL)
- wydajność zapytań Columnstore
- rozpocznij pracę z Columnstore w czasie rzeczywistym analityka operacyjna
- indeksy columnstore dla hurtowni danych
- indeksy columnstore i Polityka scalania dla grup wierszy