Skew join optimization

Az adatlökés olyan feltétel, amelyben a tábla adatai egyenetlenül vannak elosztva a fürt partíciói között. Az adatdedlódás súlyosan visszaminősülhet a lekérdezések teljesítményében, különösen az illesztésekkel kapcsolatosaknál. A nagy táblák közötti illesztés megköveteli az adatok eltolását, és az eltolás a fürt munkaegyensúlyának rendkívüli kiegyensúlyozatlanságát vonhatja vissza. Valószínű, hogy az adatlökés hatással van a lekérdezésre, ha úgy tűnik, hogy egy lekérdezés elakadt néhány feladat befejezésekor (például a 200 utolsó 3 feladata). Annak ellenőrzése, hogy az adatdeduklúdó hatással van-e a lekérdezésre:

  1. Kattintson az elakadt szakaszra, és ellenőrizze, hogy csatlakozik-e.
  2. A lekérdezés befejezése után keresse meg az illesztés fázisát, és ellenőrizze a feladat időtartamának eloszlását.
  3. Rendezheti a tevékenységeket az időtartam csökkentése alapján, és ellenőrizheti az első néhány feladatot. Ha egy feladat végrehajtása sokkal több időt vett igénybe, mint a többi, akkor van egy kis elenyés.

Az eltérést a Delta Lake Azure Databricks SQL elfogadja az eltérési tippeket a lekérdezésekben. Az eltűnésmutatóból származó információk alapján a Databricks Runtime jobb lekérdezéstervet tud összeépíteni, amely nem rendelkezik adatdeduklúdóval.

Megjegyzés

A Databricks Runtime 7.3-as vagy magasabb rendszer esetén nincs szükség az eltért illesztésmutatókra. Ha az adaptív lekérdezés-végrehajtás (AQE) engedélyezve van, a rendszer automatikusan gondoskodik az spark.sql.adaptive.skewJoin.enabled eltolásról. Lásd: Adaptív lekérdezés-végrehajtás.

Az eltintésmutató konfigurálása relációs névvel

Az eltúszó tippnek tartalmaznia kell legalább az eltenyéshez kapcsolódó kapcsolat nevét. A relációs adatok táblázat, nézet vagy segédlekérdezés. Az ezzel a relációs kapcsolatokkal való összes csatlakozás ezt követően az eltintés-illesztés optimalizálását használja.

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

A relációs névvel és az oszlopnevekkel együtt konfigurálhatja az eltértségmutatót

Előfordulhat, hogy egy relációs kapcsolaton több illesztés is van, és csak ezek egy része fog elenyedni. A tolódás-illesztés optimalizálása némi többletterhelést okoz, ezért jobb csak szükség esetén használni. Erre a célra az eltértségmutató elfogadja az oszlopneveket. Csak az ezekkel az oszlopokkal való illesztés használja az eltlökés-illesztés optimalizálását.

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

Az eltintésmutató konfigurálása relációs névvel, oszlopnevekkel és eltért értékekkel

A tippben is megadhat eltúszó értékeket. A lekérdezéstől és az adatoktól függően az eltűnés értékei ismertek lehetnek (például azért, mert soha nem változnak), vagy könnyen kideríthetőek. Ez csökkenti az eltökintés-illesztés optimalizálásával kapcsolatos többletterhelést. Ellenkező esetben a Delta Lake automatikusan észleli őket.

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