Skeva kopplings optimering

Data skevning är ett villkor där tabellens data inte är jämnt fördelade mellan partitioner i klustret. Data snedheten kan nedgradera prestanda för frågor, särskilt de med kopplingar. Kopplingar mellan stora tabeller kräver blandning-data och skeven kan leda till en extrem obalans i klustret. Det är troligt att data skeven påverkar en fråga om en fråga verkar ha fastnat i mycket få uppgifter (till exempel de senaste 3 aktiviteterna av 200). Verifiera så här:

  1. Klicka på den fas som är fastna och kontrol lera att den gör en koppling.
  2. När frågan har slutförts hittar du den fas som gör en koppling och kontrollerar distribution av aktivitets varaktighet.
  3. Sortera aktiviteterna genom att minska varaktigheten och kontrol lera de första aktiviteterna. Om en aktivitet tog mycket längre tid att slutföra än andra aktiviteter, finns det skeva.

För att åtgärda skeva, accepterar delta Lake på Azure Databricks SQL sneda tips i frågor. Med hjälp av informationen från dessa tips kan Spark konstruera en bättre frågeplan, en som inte påverkar data skevningen.

Endast Relations namn

Ett skevningen-tips måste innehålla minst namnet på relationen med Snedställ. En relation är en tabell, vy eller en under fråga. Alla kopplingar till den här relationen använder sedan skev kopplings optimering.

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

Relation och kolumner

Det kan finnas flera kopplingar i en relation och bara vissa av dem kommer att bli lidande. Sned kopplings optimering har en del kostnader så det är bättre att bara använda den när det behövs. För det här ändamålet accepterar skevningen-tipset kolumn namn. Endast kopplingar med de här kolumnerna använder sned kopplings optimering.

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

Relations-, kolumn-och skev värden

Du kan också ange sned värden i tipset. Beroende på fråga och data kan sned värdena vara kända (till exempel eftersom de aldrig ändras) eller är enkla att ta reda på. Detta minskar behovet av sned kopplings optimering. Annars identifierar delta sjö 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