Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Eksploracja SQL Server 2014 WYBIERZ PARALELIZM

SQL Server 2014 CTP1 jest już dostępny od kilku tygodni i prawdopodobnie spotkałeś się z dużym naciskiem na tabele zoptymalizowane pod kątem pamięci i aktualizowalne indeksy magazynu kolumn. Chociaż są one z pewnością godne uwagi, w tym poście chciałem zapoznać się z nowym ulepszeniem równoległości SELECT… INTO. Ulepszenie jest jedną z tych gotowych do noszenia zmian, które z wyglądu nie będą wymagały znaczących zmian w kodzie, aby zacząć z niego korzystać. Moje badania zostały przeprowadzone przy użyciu wersji Microsoft SQL Server 2014 (CTP1) – 11.0.9120.5 (X64), Enterprise Evaluation Edition.

RÓWNOLEGLE WYBIERZ … DO

SQL Server 2014 wprowadza obsługę równoległą SELECT ... INTO dla baz danych i do przetestowania tej funkcji użyłem bazy danych AdventureWorksDW2012 i wersji tabeli FactInternetSales, która zawierała 61 847 552 wierszy (byłem odpowiedzialny za dodanie tych wierszy; domyślnie nie są one dostarczane z bazą danych).

Ponieważ ta funkcja, od CTP1, wymaga poziomu zgodności bazy danych 110, do celów testowych ustawiłem bazę danych na poziom zgodności 100 i wykonałem następujące zapytanie dla mojego pierwszego testu:

SELECT  [ProductKey],
        [OrderDateKey],
        [DueDateKey],
        [ShipDateKey],
        [CustomerKey],
        [PromotionKey],
        [CurrencyKey],
        [SalesTerritoryKey],
        [SalesOrderNumber],
        [SalesOrderLineNumber],
        [RevisionNumber],
        [OrderQuantity],
        [UnitPrice],
        [ExtendedAmount],
        [UnitPriceDiscountPct],
        [DiscountAmount],
        [ProductStandardCost],
        [TotalProductCost],
        [SalesAmount],
        [TaxAmt],
        [Freight],
        [CarrierTrackingNumber],
        [CustomerPONumber],
        [OrderDate],
        [DueDate],
        [ShipDate]
INTO dbo.FactInternetSales_V2
FROM dbo.FactInternetSales;

Czas wykonywania zapytania wynosił 3 minuty i 19 sekund na mojej testowej maszynie wirtualnej, a rzeczywisty plan wykonania zapytania był następujący:

SQL Server korzystał z planu szeregowego, jak się spodziewałem. Zauważ również, że moja tabela zawierała indeks nieklastrowanego magazynu kolumn, który został przeskanowany (utworzyłem ten nieklastrowany indeks magazynu kolumn do użytku z innymi testami, ale później pokażę ci również plan wykonania zapytania indeksu magazynu kolumn w klastrach). Plan nie używał równoległości, a skanowanie indeksu magazynu kolumn używało trybu wykonywania wierszy zamiast trybu wykonywania wsadowego.

Następnie zmodyfikowałem poziom zgodności bazy danych (i zauważ, że nie ma jeszcze poziomu zgodności SQL Server 2014 w CTP1):

USE [master];
GO
ALTER DATABASE [AdventureWorksDW2012] SET COMPATIBILITY_LEVEL = 110;
GO

Upuściłem tabelę FactInternetSales_V2, a następnie ponownie wykonałem mój oryginalny SELECT ... INTO operacja. Tym razem czas wykonania zapytania wynosił 1 minutę i 7 sekund, a rzeczywisty plan wykonania zapytania wyglądał następująco:

Mamy teraz równoległy plan i jedyną zmianą, jaką musiałem wprowadzić, był poziom zgodności bazy danych dla AdventureWorksDW2012. Moja testowa maszyna wirtualna ma przydzielone do niej cztery procesory wirtualne, a plan wykonania zapytania rozdziela wiersze na cztery wątki:

Nieklastrowane skanowanie indeksu magazynu kolumn, podczas korzystania z równoległości, nie używało trybu wykonywania wsadowego. Zamiast tego używał trybu wykonywania wierszy.

Oto tabela przedstawiająca dotychczasowe wyniki testów:

Typ skanowania Poziom zgodności RÓWNOLEGLE WYBIERZ … DO Tryb wykonywania Czas trwania
Skanowanie indeksu magazynu kolumn bez klastrów 100 Nie Wiersz 3:19
Skanowanie indeksu magazynu kolumn bez klastrów 110 Tak Wiersz 1:07


Więc w następnym teście upuściłem nieklastrowany indeks magazynu kolumn i ponownie wykonałem SELECT ... INTO zapytanie przy użyciu poziomu zgodności bazy danych 100 i 110.

Test na poziomie zgodności 100 trwał 5 minut i 44 sekundy i został wygenerowany następujący plan:

Szeregowe skanowanie indeksu klastrowego zajęło 2 minuty i 25 sekund dłużej niż szeregowe skanowanie indeksu magazynu bezklastrowego.

Przy użyciu poziomu zgodności 110 uruchomienie zapytania zajęło 1 minutę i 55 sekund i wygenerowano następujący plan:

Podobnie jak w przypadku równoległego testu nieklastrowego skanowania indeksu magazynu kolumn, równoległe skanowanie indeksu klastrowego jest rozproszone w czterech wątkach:

Poniższa tabela podsumowuje te dwa wyżej wymienione testy:

Typ skanowania Poziom zgodności RÓWNOLEGLE WYBIERZ … DO Tryb wykonywania Czas trwania
Skanowanie indeksu klastrowego 100 Nie Wiersz (nie dotyczy) 5:44
Skanowanie indeksu klastrowego 110 Tak Wiersz (nie dotyczy) 1:55


Zatem zastanawiałem się nad wydajnością klastrowanego indeksu magazynu kolumn (nowość w SQL Server 2014), więc upuściłem istniejące indeksy i utworzyłem klastrowany indeks magazynu kolumn w tabeli FactInternetSales. Musiałem również usunąć osiem różnych ograniczeń kluczy obcych zdefiniowanych w tabeli, zanim mogłem utworzyć klastrowany indeks magazynu kolumn.

Dyskusja staje się nieco akademicka, ponieważ porównuję SELECT ... INTO wydajność na poziomach zgodności bazy danych, które nie oferowały klastrowanych indeksów magazynu kolumn – podobnie jak wcześniejsze testy dla nieklastrowanych indeksów magazynu kolumn na poziomie zgodności bazy danych 100 – a mimo to warto zobaczyć i porównać ogólną charakterystykę wydajności.

CREATE CLUSTERED COLUMNSTORE INDEX [CCSI_FactInternetSales] 
ON [dbo].[FactInternetSales] 
WITH (DROP_EXISTING = OFF);
GO

Nawiasem mówiąc, operacja utworzenia klastrowanego indeksu magazynu kolumn w tabeli 61 847 552 milionów wierszy zajęła 11 minut i 25 sekund z czterema dostępnymi procesorami wirtualnymi (z których operacja wykorzystywała je wszystkie), 4 GB pamięci RAM i wirtualną pamięcią gości na dyskach SSD OCZ Vertex. W tym czasie procesory nie były ustawione przez cały czas, ale raczej wyświetlały szczyty i doliny (próbka 60 sekund aktywności procesora pokazana poniżej):

Po utworzeniu klastrowanego indeksu magazynu kolumn ponownie wykonałem dwa SELECT ... INTO testy. Test poziomu zgodności 100 trwał 3 minuty i 22 sekundy, a plan był planem szeregowym zgodnie z oczekiwaniami (pokazuję wersję planu SQL Server Management Studio od czasu klastrowanego skanowania indeksu magazynu kolumn, od SQL Server 2014 CTP1 , nie jest jeszcze w pełni rozpoznawany przez Eksplorator planów):

Następnie zmieniłem poziom zgodności bazy danych na 110 i ponownie wykonałem test, który tym razem trwał 1 minutę i 11 sekund i miał następujący rzeczywisty plan wykonania:

Plan rozłożył wiersze na cztery wątki i podobnie jak nieklastrowany indeks magazynu kolumn, trybem wykonywania klastrowanego skanowania indeksu magazynu kolumn był wiersz, a nie wsadowy.

Poniższa tabela podsumowuje wszystkie testy w tym poście (w kolejności czasu trwania, od niskiego do wysokiego):

Typ skanowania Poziom zgodności RÓWNOLEGLE WYBIERZ … DO Tryb wykonywania Czas trwania
Skanowanie indeksu magazynu kolumn bez klastrów 110 Tak Wiersz 1:07
Skanowanie indeksu klastrowego magazynu kolumn 110 Tak Wiersz 1:11
Skanowanie indeksu klastrowego 110 Tak Wiersz (nie dotyczy) 1:55
Skanowanie indeksu magazynu kolumn bez klastrów 100 Nie Wiersz 3:19
Skanowanie indeksu klastrowego magazynu kolumn 100 Nie Wiersz 3:22
Skanowanie indeksu klastrowego 100 Nie Wiersz (nie dotyczy) 5:44


Kilka obserwacji:

  • Nie jestem pewien, czy różnica między równoległym SELECT ... INTO operacja względem nieklastrowanego indeksu magazynu kolumn w porównaniu z klastrowanym indeksem magazynu kolumn jest statystycznie istotna. Musiałbym zrobić więcej testów, ale myślę, że poczekałbym z ich wykonaniem do czasu RTM.
  • Mogę śmiało powiedzieć, że równoległy SELECT ... INTO znacznie przewyższała seryjne odpowiedniki w testach indeksu klastrowanego, nieklastrowanego magazynu kolumn i klastrowanego magazynu kolumn.

Warto wspomnieć, że te wyniki dotyczą wersji CTP produktu, a moje testy powinny być postrzegane jako coś, co może zmienić zachowanie przez RTM – więc mniej interesowały mnie czasy trwania autonomiczne w porównaniu z tym, jak te czasy trwania w porównaniu między seryjnymi i równoległymi warunki.

Niektóre funkcje wydajności wymagają znacznej refaktoryzacji – ale dla SELECT ... INTO poprawy, wszystko, co musiałem zrobić, to podnieść poziom zgodności bazy danych, aby zacząć dostrzegać korzyści, co zdecydowanie doceniam.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Klauzula SQL OVER() - kiedy i dlaczego jest przydatna?

  2. Jak wyłączyć ograniczenie klucza obcego w programie SQL Server (przykłady T-SQL)

  3. Pobierz ostatnio wstawiony identyfikator wiersza (z instrukcją SQL)

  4. Sprawdź, czy obiekt jest procedurą składowaną, używając OBJECTPROPERTY() w SQL Server

  5. Konfigurowanie zależności maven dla SQL Server