Skeva kopplingsoptimering med sneda tips

Den här artikeln beskriver hur du använder snedstreckstips för att förbättra datasnedvridning i en tabell, ett villkor som kan nedgradera frågeprestanda.

Kommentar

Tips för skev koppling krävs inte. Skevhet tas automatiskt hand om adaptiv frågekörning (AQE) och spark.sql.adaptive.skewJoin.enabled båda är aktiverade. Se Adaptiv frågekörning.

Vad är dataförskjutning?

Dataskevhet är ett villkor där en tabells data är ojämnt fördelade mellan partitioner i klustret. Datasnedställning kan allvarligt nedgradera prestanda för frågor, särskilt de med kopplingar. Kopplingar mellan stora tabeller kräver att data blandas, och skevheten kan leda till en extrem obalans i arbetet i klustret. Det är troligt att dataförskjutning påverkar en fråga om en fråga verkar ha fastnat när mycket få uppgifter slutförs (till exempel de tre sista aktiviteterna av 200). Så här kontrollerar du att dataskevhet 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 letar du reda på fasen som gör en koppling och kontrollerar fördelningen av aktivitetens varaktighet.
  3. Sortera aktiviteterna genom att minska varaktigheten och kontrollera de första aktiviteterna. Om en uppgift tog mycket längre tid att slutföra än de andra aktiviteterna är det skevt.

För att förbättra skevhet accepterar Delta Lake i Azure Databricks SQL skeva tips i frågor. Med informationen från ett skevt tips kan Databricks Runtime konstruera en bättre frågeplan, en som inte lider av datasnedvridning.

Konfigurera sned ledtråd med relationsnamn

Ett skevt tips måste innehålla minst namnet på relationen med skevhet. En relation är en tabell, vy eller en underfråga. Alla kopplingar med den här relationen använder sedan skev kopplingsoptimering.

-- 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 sned ledtråd med relationsnamn och kolumnnamn

Det kan finnas flera kopplingar i en relation och endast vissa av dem kommer att drabbas av skevhet. Optimering av skev koppling har vissa omkostnader, så det är bättre att bara använda den när det behövs. För det här ändamålet accepterar skevhetstipset kolumnnamn. Endast kopplingar till dessa kolumner använder skev kopplingsoptimering.

-- 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 sned ledtråd med relationsnamn, kolumnnamn och snedställvärden

Du kan också ange skevhetsvärden i tipset. Beroende på fråga och data kan skevhetsvärdena vara kända (till exempel för att de aldrig ändras) eller kan 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