Sdílet prostřednictvím


Optimalizace nerovnoměrné distribuce spojení s využitím tipů nerovnoměrné distribuce

Důležité

Tato dokumentace byla vyřazena a nemusí být aktualizována. Produkty, služby nebo technologie uvedené v tomto obsahu se už nepodporují.

Nejsou vyžadovány rady ke zkosení spojení. Databricks ve výchozím nastavení zpracovává nerovnoměrnou distribuci pomocí adaptivního spouštění dotazů (AQE). Viz adaptivní spouštění dotazů.

Poznámka:

spark.sql.adaptive.skewJoin.enabled musí být True, což je výchozí nastavení v Azure Databricks.

Co je nerovnoměrná distribuce dat?

Nerovnoměrná distribuce dat je podmínka, ve které jsou data tabulky nerovnoměrně rozdělená mezi oddíly v clusteru. Nerovnoměrná distribuce dat může výrazně snížit výkon dotazů, zejména dotazů s propojeními. Spojení mezi velkými tabulkami vyžadují prohazování dat a nerovnoměrnou distribuci můžou vést k extrémní nevyváženosti práce v clusteru. Je pravděpodobné, že nerovnoměrná distribuce dat ovlivňuje dotaz, pokud se zdá, že dotaz zablokuje dokončení velmi málo úkolů (například posledních 3 úkolů z roku 200). Ověření, že nerovnoměrná distribuce dat ovlivňuje dotaz:

  1. Klikněte na fázi, která je zablokovaná, a ověřte, že se připojuje.
  2. Po dokončení dotazu vyhledejte fázi, která provede spojení, a zkontrolujte distribuci doby trvání úlohy.
  3. Seřaďte úkoly zkrácením doby trvání a zkontrolujte několik prvních úkolů. Pokud dokončení jednoho úkolu trvalo mnohem déle než ostatní úkoly, dochází k nerovnoměrné distribuci.

Pro zlepšení nerovnoměrné distribuce přijímá Delta Lake v Azure Databricks SQL rady nerovnoměrné distribuce v dotazech. Díky informacím z nápovědy nerovnoměrné distribuce může Databricks Runtime vytvořit lepší plán dotazů, který nemá nerovnoměrnou distribuci dat.

Konfigurace nápovědy ke nerovnoměrné distribuci s názvem relace

Tip nerovnoměrné distribuce musí obsahovat alespoň název relace se zkosenou zkosenou. Relace je tabulka, zobrazení nebo poddotaz. Všechna spojení s tímto vztahem pak používají optimalizaci nerovnoměrné distribuce spojení.

-- 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

Konfigurace nápovědy ke nerovnoměrné distribuci pomocí názvů relačních názvů a sloupců

V relaci může existovat více spojení a pouze některé z nich budou mít nerovnoměrnou distribuci. Optimalizace nerovnoměrné distribuce spojení má určitou režii, takže je lepší ji použít pouze v případě potřeby. Pro tento účel tip nerovnoměrné distribuce přijímá názvy sloupců. Optimalizace spojení s těmito sloupci používají pouze nerovnoměrnou optimalizaci spojení.

-- 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

Konfigurace nápovědy ke nerovnoměrné distribuci s použitím názvu relace, názvů sloupců a zkosených hodnot

V nápovědě můžete také zadat hodnoty nerovnoměrné distribuce. V závislosti na dotazu a datech můžou být hodnoty nerovnoměrné distribuce známé (například proto, že se nikdy nemění) nebo se snadno zjistí. Tím se sníží režijní náklady na optimalizaci spojení nerovnoměrné distribuce. V opačném případě je Delta Lake rozpozná automaticky.

-- 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