Optymalizacja sprzężenia niesymetrycznego przy użyciu wskazówek niesymetrycznych

Ważne

Ta dokumentacja została wycofana i może nie zostać zaktualizowana. Produkty, usługi lub technologie wymienione w tej zawartości nie są już obsługiwane.

Niesymetryczne wskazówki sprzężenia nie są wymagane. Usługa Databricks domyślnie obsługuje niesymetryczność przy użyciu adaptacyjnego wykonywania zapytań (AQE). Zobacz Wykonywanie zapytań adaptacyjnych.

Uwaga

spark.sql.adaptive.skewJoin.enabled musi mieć Truewartość , która jest ustawieniem domyślnym w usłudze Azure Databricks.

Co to jest niesymetryczność danych?

Niesymetryczność danych to stan, w którym dane tabeli są nierównomiernie rozłożone między partycjami w klastrze. Niesymetryczność danych może poważnie obniżyć wydajność zapytań, zwłaszcza tych ze sprzężeniami. Sprzężenia między dużymi tabelami wymagają mieszania danych, a niesymetryczność może prowadzić do skrajnej nierównowagi pracy w klastrze. Prawdopodobnie niesymetryczność danych ma wpływ na zapytanie, jeśli zapytanie wydaje się blokować wykonywanie bardzo niewielu zadań (na przykład ostatnich 3 z 200). Aby sprawdzić, czy niesymetryczność danych ma wpływ na zapytanie:

  1. Kliknij etap, który jest zablokowany i sprawdź, czy wykonuje sprzężenia.
  2. Po zakończeniu zapytania znajdź etap, który wykonuje sprzężenia, i sprawdź rozkład czasu trwania zadania.
  3. Posortuj zadania według malejącego czasu trwania i sprawdź kilka pierwszych zadań. Jeśli wykonanie jednego zadania zajęło znacznie więcej czasu niż pozostałych zadań, mamy do czynienia z niesymetrycznością.

Aby złagodzić niesymetryczność, usługa Delta Lake w usłudze Azure Databricks SQL akceptuje niesymetryczne wskazówki w zapytaniach . Dzięki informacjom z wskazówki o niesymetryczności środowisko Databricks Runtime może utworzyć lepszy plan zapytania, taki, który nie cierpi na niesymetryczność danych.

Konfigurowanie niesymetrycznej wskazówki o nazwie relacji

Niesymetryczna wskazówka musi zawierać co najmniej nazwę relacji ze niesymetrycznością. Relacja to tabela, widok lub podzapytywanie. Wszystkie sprzężenia z tą relacją używają optymalizacji sprzężenia niesymetrycznego.

-- table with skew
SELECT /*+ SKEW('orders') */
  *
  FROM orders, customers
  WHERE c_custId = o_custId

-- subquery with skew
SELECT /*+ SKEW('C1') */
  *
  FROM (SELECT * FROM customers WHERE c_custId < 100) C1, orders
  WHERE C1.c_custId = o_custId

Konfigurowanie wskazówki niesymetryczności z nazwami relacji i nazwami kolumn

Może istnieć wiele sprzężeń w relacji i tylko niektóre z nich będą cierpieć na niesymetryczność. Optymalizacja sprzężenia niesymetrycznego ma pewne obciążenie, dlatego lepiej jest używać go tylko wtedy, gdy jest to konieczne. W tym celu wskazówka niesymetryczności akceptuje nazwy kolumn. Tylko sprzężenia z tymi kolumnami używają optymalizacji sprzężenia niesymetrycznego.

-- single column
SELECT /*+ SKEW('orders', 'o_custId') */
  *
  FROM orders, customers
  WHERE o_custId = c_custId

-- multiple columns
SELECT /*+ SKEW('orders', ('o_custId', 'o_storeRegionId')) */
  *
  FROM orders, customers
  WHERE o_custId = c_custId AND o_storeRegionId = c_regionId

Konfigurowanie wskazówki niesymetryczności z nazwami relacji, nazwami kolumn i wartościami niesymetryczności

Można również określić niesymetryczne wartości w wskazówce. W zależności od zapytania i danych wartości niesymetryczności mogą być znane (na przykład dlatego, że nigdy się nie zmieniają) lub mogą być łatwe do znalezienia. W ten sposób zmniejsza się obciążenie optymalizacji sprzężenia niesymetrycznego. W przeciwnym razie usługa Delta Lake wykrywa je automatycznie.

-- single column, single skew value
SELECT /*+ SKEW('orders', 'o_custId', 0) */
  *
  FROM orders, customers
  WHERE o_custId = c_custId

-- single column, multiple skew values
SELECT /*+ SKEW('orders', 'o_custId', (0, 1, 2)) */
  *
  FROM orders, customers
  WHERE o_custId = c_custId

-- multiple columns, multiple skew values
SELECT /*+ SKEW('orders', ('o_custId', 'o_storeRegionId'), ((0, 1001), (1, 1002))) */
  *
  FROM orders, customers
  WHERE o_custId = c_custId AND o_storeRegionId = c_regionId