Omówienie planów zapytań

Ukończone

Jak uzyskać plan zapytania w dedykowanej puli SQL usługi Azure Synapse Analytics

Często inżynierowie baz danych i administratorzy baz danych muszą analizować i badać wykonywanie zapytań w pulach SQL. Ta analiza odbywa się przy użyciu dynamicznych widoków zarządzania (DMV).

Uwaga

Uprawnienia do odpytywania DMV wymagają uprawnienia WYŚWIETL STAN BAZY DANYCH lub KONTROLA. W typowych scenariuszach przyznanie uprawnienia WYŚWIETL STAN BAZY DANYCH jest preferowaną metodą, ponieważ jest bardziej restrykcyjne.

GRANT VIEW DATABASE STATE to TestUser; 

Ostrzeżenie

Osoba atakująca może użyć sys.dm_pdw_exec_requests, aby pobrać informacje o określonych obiektach bazy danych, mając jedynie uprawnienie do WYŚWIETLANIA STANU SERWERA i nie posiadając żadnych innych uprawnień specyficznych dla bazy danych.

Zapytania usługi Azure Synapse. które są wykonywane, są rejestrowane w sys.dm_pdw_exec_requests, który zawiera ostatnie 10 000 wykonanych zapytań. Możesz użyć następującego zapytania, aby określić 10 najdłużej działających zapytań

SELECT TOP 10 request_id, status, total_elapsed_time
FROM sys.dm_pdw_exec_requests
WHERE status not in ('completed', 'Failed','Cancelled')
ORDER BY total_elapsed_time DESC

Podczas przeglądania wyników te w stanie wstrzymania mogą być kolejkowane z powodu braku zasobów spowodowanego wieloma aktywnie działającymi zapytaniami. Te zapytania będą również wyświetlane w sys.dm_pdw_waits, gdzie twoja uwaga powinna być bardziej skoncentrowana na oczekiwaniach, w tym UserConcurrencyResourceType. Istnieją inne przyczyny, dla których zapytania mogą znajdować się w kolejce oczekiwania, takie jak blokady obiektów. Więcej informacji na ten temat można znaleźć, badając zapytania oczekujące na zasoby.

Uwaga

Najlepiej jest użyć LABEL, aby użytkownicy mogli łatwo znaleźć i rozwiązać problemy z zapytaniami o niskiej wydajności, korzystając z sys.dm_pdw_exec_requests, pokazanych poniżej.

-- you can use an asterisk to show all attributes returned from the DMV
-- but request_id is what will be used in the next step.

SELECT request_id, status, total_elapsed_time
FROM sys.dm_pdw_exec_requests
WHERE [label] = 'MyQuery';

Jak odczytać plan zapytania

Po uzyskaniu request_id użyj go z sys.dm_pdw_request_steps, aby pobrać rozproszony plan SQL (DSQL), jak to pokazano poniżej.

-- be sure to replace QID#### with the request_id you retrieved above

SELECT * FROM sys.dm_pdw_request_steps
WHERE request_id = 'QID####'
ORDER BY step_index;

Uwaga

Jeśli powrót planu DSQL zajmuje dużo czasu, może to być spowodowane przez złożony plan wymagający wielu kroków DSQL lub tylko długotrwały krok. Jeśli istnieje kilka operacji przenoszenia w planie zawierającym wiele kroków, rozważ optymalizację dystrybucji tabel, których dotyczy, aby zmniejszyć przenoszenie danych.

Podczas przeglądania zwróconego planu DSQL można znaleźć dodatkowe informacje na temat poszczególnych kroków, sprawdzając operation_type dowolnego długotrwałego kroku. Zanotuj Indeks Kroku, który wykorzystamy do przeanalizowania dwóch typów operacji wpływających na wydajność.

Operacje SQL, które obejmują:

  • OnOperation
  • Operacja zdalna
  • Operacja powrotu

Operacje przenoszenia danych, w tym:

  • ShuffleMoveOperation
  • BroadcastMoveOperation
  • TrimMoveOperation
  • PartitionMoveOperation
  • OperacjaPrzenoszenia
  • CopyOperation

W poprzednim kroku przy użyciu sys.dm_pdw_request_steps chcemy użyć request_id i step_index , aby pobrać informacje o wykonaniu kroku zapytania we wszystkich rozproszonych bazach danych przy użyciu zapytania podobnego do poniższego.

--Find the distribution run times for a particular SQL Step
--retrieve request_id and step_index with the values from the steps above.

SELECT * FROM sys.dm_pdw_sql_requests
WHERE request_id = 'QID####' AND step_index = 4;

Gdy krok zapytania nadal działa, DBCC PDW_SHOWEXECUTIONPLAN można użyć do pobrania oszacowanego planu SQL Server z pamięci podręcznej planu dla kroku wykonywanego na określonej dystrybucji, jak pokazano poniżej.

 --Retrieve the SQL Server execution plan for a running query on a particular SQL pool or control node
 --Replace distribution_id and spid from the results from the previous query
 --DBCC PDW_SHOWEXECUTIONPLAN( distribution_id, spid)

 DBCC PDW_SHOWEXECUTIONPLAN(7, 31)

Poszukiwanie zmian w rozproszonych bazach danych

Użycie identyfikatora żądania i indeksukroku, jak wcześniej pobrano powyżej z sys.dm_pdw_dms_workers, umożliwi pobieranie informacji o wszelkich krokach przenoszenia danych uruchomionych w każdej dystrybucji, jak pokazano poniżej.

 --Find all workers that are completing a Data Movement Step and their details
 --Replace request_id and step_index with the values from the prior steps shown above.

SELECT * FROM sys.dm_pdw_dms_workers
WHERE request_id = 'QID####' AND step_index = 2;

Uwaga

sprawdzenie total_elapsed_time pomoże określić, czy określona dystrybucja trwa znacznie dłużej niż inne w przypadku przenoszenia danych. w przypadku dowolnego długotrwałego rozkładu sprawdź, czy kolumna rows_processed jest znacznie większa niż inne, aby określić, czy jest to istotne. Jeśli tak, może to wskazywać na niesymetryczność danych bazowych.

Przykładem złej operacji, która może powodować problemy z wydajnością, takie jak niesymetryczność danych, jest dystrybucja w kolumnie zawierającej wiele wartości NULL, co spowoduje, że wiersze zostaną wylądowane w tym samym rozkładzie. Jeśli to możliwe, wyeliminuj wartości null lub odfiltruj je całkowicie z zapytania, aby zwiększyć wydajność.

Aby pomóc w rozwiązywaniu problemów, zapoznaj się z sekcjami tworzenia statystyk w celu zwiększenia wydajności, zrozumienia problemów z wydajnością związanych z tabelami, zrozumienia projektu rozkładu tabel i używania indeksów w celu zwiększenia wydajności