Optimalisatie van scheve joins door middel van schevehints
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). Zie Adaptieve queryuitvoering.
Notitie
spark.sql.adaptive.skewJoin.enabled
moet True
zijn. Dit is de standaardinstelling in Azure Databricks.
Wat is scheeftrekken van gegevens?
Gegevensscheefheid is een toestand waarin de gegevens van een tabel ongelijk verdeeld zijn over partities in de cluster. Gegevens scheeftrekken kunnen de prestaties van query's ernstig downgraden, met name die met joins. Joins tussen grote tabellen vereisen het verschuiven van gegevens en de scheefverdeling kan leiden tot een extreme onevenwichtigheid van de werklast in het cluster. Het is waarschijnlijk dat gegevensscheefheid van invloed is op een query als deze lijkt vast te zitten op het voltooien van zeer weinig taken (bijvoorbeeld de laatste drie taken van de 200). Controleren of gegevens scheeftrekken van invloed zijn op een query:
- Klik op de fase die is vastgelopen en controleer of deze een join uitvoert.
- Nadat de query is voltooid, zoekt u naar de fase die een join uitvoert en controleert u de verdeling van de taakduur.
- Sorteer de taken door de duur te verlagen en de eerste paar taken te controleren. Als één taak veel langer duurde dan de andere taken, is er sprake van scheefheid.
Delta Lake op Azure Databricks SQL accepteert scheefheidshints in query's om scheeftrekken te verbeteren. Met de informatie van een scheeftrekkende hint kan Databricks Runtime een beter queryplan maken, een plan dat geen last heeft van scheeftrekken van gegevens.
Skew-hint configureren met relatienaam
Een scheefhint moet ten minste de naam van de relatie met scheefheid 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
Skew hint configureren met relatienaam en kolomnamen
Er kunnen meerdere joins zijn voor een relatie en slechts enkele daarvan hebben last van een ongelijke verdeling. Optimalisatie van skew joins heeft enige extra belasting, 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 gebruiken scheefheidsoptimalisatie.
-- 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 scheeftrekwaarden 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