SQL Server 2014 CTP1 wprowadza rozszerzenia do opcji operacji online, co będzie dobrą wiadomością dla firm hostujących bardzo duże bazy danych, które nie wymagają przestojów.
Aby ustawić kontekst, wyobraź sobie, że używasz programu SQL Server 2012 Enterprise Edition do zarządzania indeksami w trybie online i funkcji partycjonowania indeksu i próbujesz wykonać następującą przebudowę indeksu w tabeli partycjonowanej:
ALTER INDEX [PK_FactInternetSales_SalesOrderNumber_SalesOrderLineNumber] ON [dbo].[FactInternetSales] REBUILD PARTITION = ALL WITH (ONLINE= ON);
Testując to w SQL Server 2012, jesteśmy w stanie odbudować wszystkie partycje online bez błędów. Ale co, jeśli chcemy określić konkretną partycję zamiast wszystkich partycji?
ALTER INDEX [PK_FactInternetSales_SalesOrderNumber_SalesOrderLineNumber] ON [dbo].[FactInternetSales] REBUILD PARTITION = 1 WITH (ONLINE= ON);
Próbując to zrobić w SQL Server 2012 lub starszym, zobaczysz następujący komunikat o błędzie:
Msg 155, Poziom 15, Stan 1, Wiersz 4„ONLINE” nie jest rozpoznawaną opcją ODBUDOWYWANIA PARTYCJI ALTER INDEX.
Jednak począwszy od programu SQL Server 2014 (począwszy od CTP1), obsługiwane są teraz operacje indeksowania pojedynczej partycji w trybie online. I jest to z pewnością wielka sprawa w przypadku bardzo dużych scenariuszy konserwacji stołu, w których wolisz, a nawet musisz podzielić ogólną konserwację na mniejsze części przez pewien czas. Możesz także chcieć przeprowadzić konserwację na poziomie partycji tylko dla tych partycji, które faktycznie tego wymagają – na przykład tych partycji, które faktycznie przekraczają określony poziom fragmentacji.
Aby przetestować tę funkcjonalność SQL Server 2014 CTP1 użyłem AdventureWorksDW2012 z wersją FactInternetSales zawierającą 61 847 552 wierszy i podzieloną na partycje według kolumny ShipDate.
Odbudowanie wszystkich partycji online dla tabeli przy użyciu PARTITION =ALL
w moim środowisku testowym zajęło 3 minuty i 23 sekundy. Jeśli chodzi o całkowity czas trwania, moje testy dotyczyły indeksów, które nie były aż tak pofragmentowane, więc czas trwania 3 minuty i 23 sekundy reprezentuje średni czas trwania z kilku testów. Należy również pamiętać, że w tym czasie nie działały konkurencyjne obciążenia, więc przebudowa online odbywa się bez konieczności konkurowania z innymi znaczącymi obciążeniami w stosunku do danego indeksu.
Kształt planu wykonania zapytania dla odbudowy indeksu online przy użyciu PARTITION =ALL
wyglądało następująco:
Plan wykonania przebudowy online wszystkich partycji
Zwróć uwagę, że operacje są włączone równolegle, z wyjątkiem operatora Constant Scan. W planie wykonania zapytania można zobaczyć 39 wierszy w zewnętrznym odwołaniu Constant Scan, które są przekazywane do operatora Distribute Streams, a następnie sterują zagnieżdżoną pętlą.
Znaczenie 39 rzędów? Następujące zapytanie weryfikuje maksymalną liczbę numerów partycji z sys.dm_db_partition_stats
. W moim środowisku testowym wynik wynosił 39 dla maksymalnej liczby partycji, co odpowiada temu, co widziałem dla rzeczywistych wierszy Constant Scan:
SELECT MAX([partition_number]) AS [max_partition_number] FROM [sys].[dm_db_partition_stats] WHERE [object_id] = OBJECT_ID('FactInternetSales');
Teraz zauważysz również operator Online Index Insert w poprzednim planie. Usuwanie ONLINE =ON
opcja z mojego ALTER INDEX REBUILD
(co czyni ją operacją offline) i utrzymywanie PARTITION =ALL
jedyną zmianą było posiadanie operatora „Wstaw indeks” zamiast „Wstaw indeks online” w planie wykonania zapytania – a także skrócenie czasu trwania, gdzie mój test wykazał czas wykonania 1 minutę i 9 sekund w porównaniu z opcją online 3 minuty i 23 sekundy.
Następnie przetestowałem odbudowę online jednej partycji z 5 678 080 wierszami (pamiętaj, że całkowita liczba wierszy tabeli wynosi 61 847 552 wierszy). W przypadku tego testu całkowity czas trwania trwał dokładnie 1 minutę i miał następujący kształt planu wykonania zapytania:
Plan wykonania przebudowy pojedynczej partycji online
Pierwsza obserwacja jest taka, że jest to plan seryjny. Zauważ też, że powiedziałem, że wybrałem jedną partycję z oryginalnych 39, chociaż ta konkretna partycja reprezentowała około 9% wierszy w tabeli. Zauważ też, że Constant Scan pokazuje 1 wiersz zamiast 39, jak bym się spodziewał.
A co z czasem trwania odbudowy pojedynczej partycji w trybie offline? W moim środowisku testowym zajęło to 11 sekund w porównaniu do 1 minuty odbudowy online. Kształt planu wykonania zapytania dla przebudowy pojedynczej partycji w trybie offline był następujący:
Plan wykonania przebudowy pojedynczej partycji w trybie offline
Zauważ, że nie ma stałego skanowania ani skojarzonego procesu zagnieżdżonych pętli, a także zauważ, że ten plan ma teraz operatorów równoległych w porównaniu z poprzednim planem szeregowym, mimo że oba wykonują skanowanie indeksu klastrowego dla 5 678 080 wierszy. Również wyszukiwanie słowa kluczowego „partycja” w tekście planu XML dla operacji indeksowania równoległego w trybie offline na pojedynczej partycji nie dało żadnych dopasowań — w porównaniu z planem szeregowym, operacja indeksowania w trybie online na pojedynczej partycji, która miała wartość Partitioned =„true” dla Klastrowe skanowanie indeksu i wstawianie indeksu online operatory fizyczne.
Powrót do głównej eksploracji…
Czy mogę wybrać kilka, ale nie wszystkie partycje w jednym wykonaniu? Niestety nie.
ZMIEŃ INDEKS
i ALTER TABLE
polecenia mają PARTYCJA =WSZYSTKIE
argument a następnie PARTYCJA =
Ile czasu zajmie odbudowanie wszystkich 39 partycji osobno i online w porównaniu z PARTITION =ALL
? czas trwania 3 minuty i 23 sekundy?
Wiemy, że zaletą przebudowy online jest możliwość ciągłego dostępu do powiązanej tabeli lub indeksu podczas operacji indeksowania. Ale w zamian za tę operację online stracimy przewagę wydajności przebudowy w porównaniu z przebudową offline. Następnie chciałem wiedzieć, w jaki sposób przebudowa online partycji jedna po drugiej będzie działać w porównaniu z PARTITION =ALL
alternatywa.
Wykonując 39 oddzielnych operacji odbudowy (jedna odbudowa dla każdej unikatowej partycji), całkowity czas trwania wykonania wyniósł 9 minut i 54 sekundy w porównaniu do PARTITION =ALL
co zajęło 3 minuty i 23 sekundy, więc wyraźnie widać, że podejście fragmentaryczne nie jest łącznie nie tak szybkie, jak przebudowa online wszystkich partycji w jednym zestawieniu. Chociaż udało mi się wykonać jedną partycję na raz, nadrzędną korzyścią jest możliwość rozdzielenia naszych działań konserwacyjnych w czasie i zachowania dostępu do obiektów podczas ich przebudowy, ale jeśli szukasz krótszej przebudowy okno, opcje offline są nadal najszybsze, a następnie online dla PARTITION =ALL
a następnie na ostatnim miejscu, wykonując jedną partycję na raz.
Poniższa tabela podsumowuje porównania czasu trwania – i ponownie, testy te były oparte na SQL Server 2014 CTP1 i bardzo konkretnym rozmiarze tabeli i konfiguracji gościa maszyny wirtualnej, więc zwracaj większą uwagę na względne czasy trwania w testach, a nie na same czasy trwania:
Opis testu | Czas trwania |
---|---|
Odbudowa wszystkich partycji offline | 1:09 |
Przebudowa online wszystkich partycji | 3:23 |
Przebudowa online jednej partycji | 1:00 |
Odbudowa jednej partycji offline | 0:11 |
Przebudowa online wszystkich partycji, jedna partycja na raz | 9:54 |
Teraz są jeszcze inne aspekty do zbadania na ten temat. Tylko dlatego, że operacja jest online, nie oznacza, że nie ma kilku chwil (lub dłużej), w których blokady są nadal utrzymywane na docelowym obiekcie. Operacje indeksowania nadal mają zachowanie blokujące dla operacji online – a SQL Server 2014 zapewnia również opcje dla tego, które omówię w osobnym poście.