Illesztés optimalizálása ferde tippek használatával
Fontos
Ez a dokumentáció ki lett állítva, és lehet, hogy nem frissül. A tartalomban említett termékek, szolgáltatások vagy technológiák már nem támogatottak.
Nincs szükség ferde illesztésre vonatkozó tippekre. A Databricks alapértelmezés szerint adaptív lekérdezés-végrehajtással (AQE) kezeli a ferdeségeket. Lásd: Adaptív lekérdezések végrehajtása.
Feljegyzés
spark.sql.adaptive.skewJoin.enabled
Az Azure Databricks alapértelmezett beállításának kell lennie True
.
Mi az az adateltérés?
Az adateltérés olyan feltétel, amelyben a tábla adatai egyenlőtlenül oszlanak el a fürt partíciói között. Az adateltérés jelentősen csökkentheti a lekérdezések teljesítményét, különösen az illesztésekkel rendelkezőket. A nagy táblák közötti illesztésekhez el kell keverni az adatokat, és a ferdeség a fürtben végzett munka rendkívül kiegyensúlyozatlanságához vezethet. Valószínű, hogy az adateltérés hatással van egy lekérdezésre, ha úgy tűnik, hogy egy lekérdezés nagyon kevés feladatot végez (például az utolsó 3 tevékenység a 200-ból). Annak ellenőrzése, hogy az adateltérés hatással van-e egy lekérdezésre:
- Kattintson a elakadt szakaszra, és ellenőrizze, hogy csatlakozik-e.
- A lekérdezés befejezése után keresse meg az illesztési szakaszt, és ellenőrizze a tevékenység időtartamának eloszlását.
- Rendezze a tevékenységeket az időtartam csökkentésével, és ellenőrizze az első néhány tevékenységet. Ha az egyik tevékenység végrehajtása sokkal tovább tartott, mint a többi tevékenység, akkor eltérés van.
A ferdeség enyhítéséhez a Delta Lake az Azure Databricks SQL-ben eltúlzási tippeket fogad a lekérdezésekben. A Databricks Runtime egy ferde tippből származó információk alapján jobb lekérdezési tervet hozhat létre, amely nem szenved adateltéréstől.
Ferdeség-tipp konfigurálása relációs névvel
A ferdeség-tippnek tartalmaznia kell legalább a ferde reláció nevét. A reláció egy tábla, nézet vagy alquery. Az ezzel a kapcsolattal rendelkező összes illesztés ezután ferde illesztésoptimalizálást használ.
-- 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
Ferdeség-tipp konfigurálása relációs névvel és oszlopnevekkel
Előfordulhat, hogy több illesztés is van egy relációban, és csak néhányuk szenved a ferdeségtől. A ferde illesztés optimalizálása némi többletterheléssel jár, ezért jobb, ha csak szükség esetén használja. Erre a célra a ferde tipp elfogadja az oszlopneveket. Csak az ezekkel az oszlopokkal rendelkező illesztések használják az illesztés optimalizálását.
-- 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
Ferdeség-tipp konfigurálása relációs névvel, oszlopnevekkel és ferde értékekkel
A tippben ferde értékeket is megadhat. A lekérdezéstől és az adatoktól függően a ferde értékek ismertek lehetnek (például azért, mert soha nem változnak), vagy könnyen kideríthetők. Ez csökkenti az illesztés optimalizálásának többletterhelését. Ellenkező esetben a Delta Lake automatikusan észleli őket.
-- 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