Optimering av skev koppling

Dataskevhet är ett villkor där en tabells data är ojämnt fördelade mellan partitioner i klustret. Datasnedställning kan kraftigt försämra prestanda för frågor, särskilt de med kopplingar. Kopplingar mellan stora tabeller kräver blandning av data, och skeva data kan leda till en extrem obalans i arbetet i klustret. Det är troligt att datasnednedgången påverkar en fråga om en fråga verkar ha fastnat och utför mycket få uppgifter (till exempel de senaste 3 uppgifterna av 200). Så här kontrollerar du att dataskevnad påverkar en fråga:

  1. Klicka på fasen som har fastnat och kontrollera att den gör en koppling.
  2. När frågan är klar kan du hitta fasen som gör en koppling och kontrollera aktivitetsvaraktighetsfördelningen.
  3. Sortera aktiviteterna genom att minska varaktigheten och kontrollera de första uppgifterna. Om en uppgift tog mycket längre tid att slutföra än de andra uppgifterna, finns det skeva.

Delta Lake på Azure Databricks SQL förvrängningstips i frågor för att förbättra snedskevmning. Med informationen från en förvrängningstips kan Databricks Runtime skapa en bättre frågeplan, en som inte drabbas av dataskevnad.

Anteckning

Med Databricks Runtime 7.3 och högre krävs inte förvrängningskopplingstips. Skevhet tas automatiskt hand om om adaptiv frågekörning (AQE) och spark.sql.adaptive.skewJoin.enabled båda är aktiverade. Se Adaptiv frågekörning.

Konfigurera förvrängningstips med relationsnamn

En förvrängningstips måste minst innehålla namnet på relationen med skeva. En relation är en tabell, vy eller en underfråga. Alla kopplingar med den här relationen använder sedan optimering av skev koppling.

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

Konfigurera förvrängningstips med relationsnamn och kolumnnamn

Det kan finnas flera kopplingar i en relation och endast vissa av dem drabbas av snedskev. Optimering av skev koppling har vissa omkostnader, så det är bättre att bara använda den när det behövs. För detta ändamål accepterar förvrängningstipset kolumnnamn. Endast kopplingar med dessa kolumner använder optimering av skev koppling.

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

Konfigurera förvrängningstips med relationsnamn, kolumnnamn och förvrängningsvärden

Du kan också ange snedskevvärden i tipset. Beroende på frågan och data kan snedställningsvärdena vara kända (till exempel eftersom de aldrig ändras) eller vara lätta att ta reda på. Detta minskar omkostnaderna för optimering av skev koppling. Annars identifierar Delta Lake dem automatiskt.

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