Dela via


Optimering av skeva kopplingar med skew-hints

Viktig

Den här dokumentationen har dragits tillbaka och kanske inte uppdateras. De produkter, tjänster eller tekniker som nämns i det här innehållet stöds inte längre.

Indikationer för skev koppling krävs inte. Databricks hanterar dataskevhet som standard med hjälp av adaptiv frågekörning (AQE). Se adaptiv frågeutvärdering.

Notera

spark.sql.adaptive.skewJoin.enabled måste vara True, vilket är standardinställningen för Azure Databricks.

Vad är dataförskjutning?

Dataförskjutning är ett villkor där en tabells data är ojämnt fördelade mellan partitioner i klustret. Datasnedvridning kan avsevärt försämra prestandan för frågeställningar, särskilt sådana med sammanfogningar. Kopplingar mellan stora tabeller kräver att data omfördelas, och skevheten kan leda till en extrem obalans i arbetet i klustret. Det är troligt att dataskevhet påverkar en fråga om frågan verkar vara fast när mycket få uppgifter är slutförda (till exempel de tre sista uppgifterna av 200). Så här kontrollerar du att dataförskjutning påverkar en fråga:

  1. Klicka på steget som har fastnat och kontrollera att det gör en koppling.
  2. När frågan är klar letar du reda på den fas som utför en sammanslagning och kontrollerar fördelningen av uppgiftens 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 uppgifterna blir det skevt.

Delta Lake på Azure Databricks SQL accepterar skevhetstips för att förbättra skevhet 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

En skev indikation måste innehålla minst namnet på relationen med snedvridning. 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 obalans. 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 skevhänvisningen 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 skevningshint med relationsnamn, kolumnnamn och skevningsvä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