Delen via


Optimalisatie van scheefheidsdeelname met scheefheidshints

Belangrijk

Deze documentatie is buiten gebruik gesteld en wordt mogelijk niet bijgewerkt. De producten, services of technologieën die in deze inhoud worden genoemd, worden niet meer ondersteund.

Hints voor scheefheidsdeelname zijn niet vereist. Databricks verwerkt standaard scheeftrekken met behulp van adaptieve queryuitvoering (AQE). Bekijk de uitvoering van adaptieve query's.

Notitie

spark.sql.adaptive.skewJoin.enabled moet zijn True, wat de standaardinstelling is in Azure Databricks.

Wat is scheeftrekken van gegevens?

Scheeftrekken van gegevens is een voorwaarde waarbij de gegevens van een tabel ongelijk zijn verdeeld over de partities in het cluster. Scheeftrekken van gegevens kan de prestaties van query's aanzienlijk verlagen, met name query's met verbindingen. Joins tussen grote tabellen vereisen het opheffen van gegevens en de scheefheid kan leiden tot een extreme onevenwichtigheid in het werk in het cluster. Het is waarschijnlijk dat gegevens scheeftrekken van invloed zijn op een query als een query zeer weinig taken lijkt te zijn vastgelopen (bijvoorbeeld de laatste drie taken van 200). Ga als volgt te werk om te controleren of het scheeftrekken van gegevens van invloed is op een query:

  1. Klik op de fase die is vastgelopen en controleer of deze een join uitvoert.
  2. Nadat de query is voltooid, zoekt u de fase die een join uitvoert en controleert u de taakduurdistributie.
  3. Sorteer de taken door de duur te verminderen en controleer de eerste paar taken. Als het voltooien van één taak veel langer duurde dan dat van andere taken, is er sprake van scheeftrekken.

Delta Lake in Azure Databricks SQL accepteert scheeftrekken in query's om scheeftrekken te asymmetrische scheeftrekken . Met de informatie van een scheeftrekkende hint kan Databricks Runtime een beter queryplan maken, een plan dat geen last heeft van scheeftrekken van gegevens.

Scheefheidshint met relationele naam configureren

Een scheefheidshint moet ten minste de naam van de relatie met scheeftrekken bevatten. Een relatie is een tabel, weergave of subquery. Alle joins met deze relatie maken vervolgens gebruik van scheefvoegingsoptimalisatie.

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

Scheefheidshint configureren met relationele naam en kolomnamen

Er kunnen meerdere joins zijn voor een relatie en slechts enkele van hen hebben last van scheeftrekken. Optimalisatie van scheefheidsdeelname heeft enige overhead, dus het is beter om deze alleen te gebruiken wanneer dat nodig is. Voor dit doel accepteert de scheve hint kolomnamen. Alleen joins met deze kolommen maken gebruik van scheefheidsoptimalisatie voor joins.

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

Scheefheidshint configureren met relationele naam, kolomnamen en scheefheidswaarden

U kunt ook scheeftrekken in de hint opgeven. Afhankelijk van de query en gegevens zijn de scheefheidswaarden mogelijk bekend (bijvoorbeeld omdat ze nooit veranderen) of kunnen ze gemakkelijk te vinden zijn. Dit vermindert de overhead van scheefheidsoptimalisatie voor joins. Anders detecteert Delta Lake ze automatisch.

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