Omówienie planów zapytań
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