shuffle lekérdezés
A következőkre vonatkozik: ✅Microsoft Fabric✅Azure Data Explorer✅Azure Monitor✅Microsoft Sentinel
A shuffle
lekérdezés a shuffle
stratégiát támogató operátorokkal használt szemantikai-megőrző átalakítás. Az érintett adatoktól függően a shuffle
stratégiával való lekérdezés jobb teljesítményt eredményezhet. Érdemesebb az shuffle lekérdezési stratégiát használni, ha a shuffle
kulcs (join
kulcs, summarize
kulcs, make-series
kulcs vagy partition
kulcs) nagy számossággal rendelkezik, és a reguláris operátori lekérdezés eléri a lekérdezési korlátokat.
Az shuffle paranccsal a következő operátorokat használhatja:
- csatlakozás
- összegzése
- sorozat
- partíciós
A shuffle
lekérdezési stratégia használatához adja hozzá a hint.strategy = shuffle
vagy hint.shufflekey = <key>
kifejezést. Ha hint.strategy=shuffle
használ, az operátor adatait az összes kulcs el fogja keverni. Ezt a kifejezést akkor használja, ha az összetett kulcs egyedi, de az egyes kulcsok nem elég egyediek, ezért az adatokat az elkeverett operátor összes kulcsával fogja elkeverni.
Az adatok shuffle stratégiával való particionálásakor az adatbetöltés minden fürtcsomóponton meg van osztva. Minden csomópont feldolgozza az adatok egy partícióját. A partíciók alapértelmezett száma megegyezik a fürtcsomópontok számával.
A partíció számát felül lehet bírálni a hint.num_partitions = total_partitions
szintaxissal, amely a partíciók számát szabályozza. Ez akkor hasznos, ha a fürtnek kis számú fürtcsomópontja van, és az alapértelmezett partíciók száma kicsi lesz, és a lekérdezés meghiúsul vagy hosszú végrehajtási időt vesz igénybe.
Jegyzet
Sok partíció használata több fürterőforrást is igénybe vehet, és csökkentheti a teljesítményt. A partíciószámot gondosan válassza ki a hint.strategy = shuffle
kezdve, és kezdje el fokozatosan növelni a partíciókat.
Bizonyos esetekben a hint.strategy = shuffle
figyelmen kívül hagyja, és a lekérdezés nem fut shuffle
stratégiában. Ez akkor fordulhat elő, ha:
- A
join
operátor bal vagy jobb oldalon egy másikshuffle
-kompatibilis operátorral (join
,summarize
,make-series
vagypartition
) rendelkezik. - A
summarize
operátor egy másikshuffle
-kompatibilis operátor (join
,summarize
,make-series
vagypartition
) után jelenik meg a lekérdezésben.
Szintaxis
A hint.strategy
= shuffle
T|
DataExpression|
join
hint.strategy
= shuffle
(
DataExpression)
T|
summarize
hint.strategy
= shuffle
DataExpression
T|
Lekérdezés|
partíció hint.strategy
= shuffle
(
SubQuery)
hint.shufflekey
=
kulccsal
T|
DataExpression|
join
hint.shufflekey
= key(
DataExpression)
T|
summarize
hint.shufflekey
= keyDataExpression
T|
make-series
hint.shufflekey
= keyDataExpression
T|
Lekérdezés|
partíció hint.shufflekey
= kulcs(
SubQuery)
További információ szintaxiskonvenciákról.
Paraméterek
Név | Típus | Szükséges | Leírás |
---|---|---|---|
T | string |
✔️ | Az a táblázatos forrás, amelynek adatait az operátornak kell feldolgoznia. |
DataExpression | string |
Implicit vagy explicit táblázatos transzformációs kifejezés. | |
lekérdezési | string |
A Trekordjain egy átalakítási kifejezés fut. | |
kulcs | string |
Használjon join kulcsot, summarize kulcsot, make-series kulcsot vagy partition kulcsot. |
|
SubQuery | string |
Átalakítási kifejezés. |
Jegyzet
A DataExpression vagy lekérdezési a választott szintaxistól függően kell megadni.
Példák
Az ebben a szakaszban szereplő példa bemutatja, hogyan használható a szintaxis az első lépésekhez.
A cikkben szereplő példák a nyilvánosan elérhető tábláit használják a fürt, például a Minták adatbázis
StormEvents
tábláját.
A cikkben szereplő példák nyilvánosan elérhető táblákat használnak, például a Weather Analytics
StormEvents
táblát, mintaadatokat.
Összegzés használata a shuffle használatával
A shuffle
summarize
operátorral végzett stratégiai lekérdezés az összes fürtcsomópont terhelését osztja meg, ahol minden csomópont az adatok egy partícióját dolgozza fel.
StormEvents
| summarize hint.strategy = shuffle count(), avg(InjuriesIndirect) by State
| count
kimeneti
Gróf |
---|
67 |
Illesztés használata shuffle használatával
StormEvents
| where State has "West"
| where EventType has "Flood"
| join hint.strategy=shuffle
(
StormEvents
| where EventType has "Hail"
| project EpisodeId, State, DamageProperty
)
on State
| count
kimeneti
Gróf |
---|
103 |
Sorozatok használata shuffle használatával
StormEvents
| where State has "North"
| make-series hint.shufflekey = State sum(DamageProperty) default = 0 on StartTime in range(datetime(2007-01-01 00:00:00.0000000), datetime(2007-01-31 23:59:00.0000000), 15d) by State
kimeneti
Állam | sum_DamageProperty | StartTime |
---|---|---|
ÉSZAK-DAKOTA | [60000,0,0] | ["2006-12-31T00:00:00.0000000Z","2007-01-15T00:1 00:00.0000000Z","2007-01-30T00:00:00.0000000Z"] |
ÉSZAK-KAROLINA | [20000,0,1000] | ["2006-12-31T00:00:00.0000000Z","2007-01-15T00:1 00:00.0000000Z","2007-01-30T00:00:00.0000000Z"] |
ATLANTI-ÓCEÁN ÉSZAK | [0,0,0] | ["2006-12-31T00:00:00.0000000Z","2007-01-15T00:1 00:00.0000000Z","2007-01-30T00:00:00.0000000Z"] |
Partíció használata shuffle használatával
StormEvents
| partition hint.strategy=shuffle by EpisodeId
(
top 3 by DamageProperty
| project EpisodeId, State, DamageProperty
)
| count
kimeneti
Gróf |
---|
22345 |
Hint.strategy=shuffle és hint.shufflekey=key összehasonlítása
Ha hint.strategy=shuffle
használ, az összes kulcs elkeveri az elkeveredett operátort. A következő példában a lekérdezés az adatokat EpisodeId
és EventId
kulcsként is összekeveri:
StormEvents
| where StartTime > datetime(2007-01-01 00:00:00.0000000)
| join kind = inner hint.strategy=shuffle (StormEvents | where DamageCrops > 62000000) on EpisodeId, EventId
| count
kimeneti
Gróf |
---|
14 |
Az alábbi lekérdezés hint.shufflekey = key
használ. A fenti lekérdezés egyenértékű ezzel a lekérdezésrel.
StormEvents
| where StartTime > datetime(2007-01-01 00:00:00.0000000)
| join kind = inner hint.shufflekey = EpisodeId hint.shufflekey = EventId (StormEvents | where DamageCrops > 62000000) on EpisodeId, EventId
kimeneti
Gróf |
---|
14 |
Az adatok összefűzése több kulccsal
Bizonyos esetekben a hint.strategy=shuffle
figyelmen kívül hagyja a rendszer, és a lekérdezés nem fut a shuffle stratégiában. Az alábbi példában például az illesztés a bal oldalán található összegzést tartalmazza, így a hint.strategy=shuffle
használata nem alkalmazza az shuffle stratégiát a lekérdezésre:
StormEvents
| where StartTime > datetime(2007-01-01 00:00:00.0000000)
| summarize count() by EpisodeId, EventId
| join kind = inner hint.strategy=shuffle (StormEvents | where DamageCrops > 62000000) on EpisodeId, EventId
kimeneti
EpisodeId | EventId | ... | EpisodeId1 | EventId1 | ... |
---|---|---|---|---|---|
1030 | 4407 | ... | 1030 | 4407 | ... |
1030 | 13721 | ... | 1030 | 13721 | ... |
2477 | 12530 | ... | 2477 | 12530 | ... |
2103 | 10237 | ... | 2103 | 10237 | ... |
2103 | 10239 | ... | 2103 | 10239 | ... |
... | ... | ... | ... | ... | ... |
A probléma megoldásához és a shuffle stratégiában való futtatáshoz válassza ki a summarize
és join
műveletekhez gyakran használt kulcsot. Ebben az esetben ez a kulcs EpisodeId
. A hint.shufflekey
segítségével adja meg a join
shuffle billentyűt a hint.shufflekey = EpisodeId
:
StormEvents
| where StartTime > datetime(2007-01-01 00:00:00.0000000)
| summarize count() by EpisodeId, EventId
| join kind = inner hint.shufflekey=EpisodeId (StormEvents | where DamageCrops > 62000000) on EpisodeId, EventId
kimeneti
EpisodeId | EventId | ... | EpisodeId1 | EventId1 | ... |
---|---|---|---|---|---|
1030 | 4407 | ... | 1030 | 4407 | ... |
1030 | 13721 | ... | 1030 | 13721 | ... |
2477 | 12530 | ... | 2477 | 12530 | ... |
2103 | 10237 | ... | 2103 | 10237 | ... |
2103 | 10239 | ... | 2103 | 10239 | ... |
... | ... | ... | ... | ... | ... |
Az összegzés és a shuffle használata a teljesítmény javítása érdekében
Ebben a példában a summarize
operátor használata shuffle
stratégiával javítja a teljesítményt. A forrástábla 150 M rekordot tartalmaz, a csoport kulcsonkénti számossága pedig 10 M, amely 10 fürtcsomópontra oszlik.
Ha summarize
operátort használ shuffle
stratégia nélkül, a lekérdezés 1:08 után ér véget, és a memóriahasználati csúcs ~3 GB:
orders
| summarize arg_max(o_orderdate, o_totalprice) by o_custkey
| where o_totalprice < 1000
| count
kimeneti
Gróf |
---|
1086 |
Miközben shuffle
stratégiát használ summarize
, a lekérdezés ~7 másodperc után fejeződik be, a memóriahasználat csúcsa pedig 0,43 GB:
orders
| summarize hint.strategy = shuffle arg_max(o_orderdate, o_totalprice) by o_custkey
| where o_totalprice < 1000
| count
kimeneti
Gróf |
---|
1086 |
Az alábbi példa egy két fürtcsomóponttal rendelkező fürt teljesítményét mutatja be egy 60M rekordot tartalmazó táblával, ahol a csoport számossága kulcsonként 2M.
A lekérdezés hint.num_partitions
nélkül történő futtatása csak két partíciót használ (fürtcsomópontok számaként), és a következő lekérdezés ~1:10 percet vesz igénybe:
lineitem
| summarize hint.strategy = shuffle dcount(l_comment), dcount(l_shipdate) by l_partkey
| consume
Ha a partíciók számát 10-esre állítja, a lekérdezés 23 másodperc után befejeződik:
lineitem
| summarize hint.strategy = shuffle hint.num_partitions = 10 dcount(l_comment), dcount(l_shipdate) by l_partkey
| consume
Az illesztés és a shuffle használata a teljesítmény javítása érdekében
Az alábbi példa bemutatja, hogyan javítja a teljesítményt shuffle
stratégia használata az join
operátorral.
A példákat egy 10 csomópontot tartalmazó fürtön vettük mintául, ahol az adatok az összes csomóponton el vannak osztva.
A lekérdezés bal oldali forrástáblája 15 M rekordot tartalmaz, ahol a join
kulcs számossága ~14 M. A lekérdezés jobb oldali forrása 150 M rekordokkal rendelkezik, és a join
kulcs számossága 10M. A lekérdezés ~28 másodperc után véget ér, és a memóriahasználati csúcs 1,43 GB:
customer
| join
orders
on $left.c_custkey == $right.o_custkey
| summarize sum(c_acctbal) by c_nationkey
Ha shuffle
stratégiát használ egy join
operátorral, a lekérdezés ~4 másodperc után ér véget, és a memóriahasználati csúcs 0,3 GB:
customer
| join
hint.strategy = shuffle orders
on $left.c_custkey == $right.o_custkey
| summarize sum(c_acctbal) by c_nationkey
Egy másik példában ugyanazokkal a lekérdezésekkel próbálkozunk egy nagyobb adathalmazon a következő feltételekkel:
- A
join
bal oldali forrása 150M, a kulcs számossága pedig 148 M. - A
join
jobb oldali forrása 1,5B, a kulcs számossága pedig ~100M.
A join
operátorral rendelkező lekérdezés 4 perc után eléri a korlátokat és az időtúllépést. Ha azonban shuffle
stratégiát használ a join
operátorral, a lekérdezés ~34 másodperc után ér véget, és a memóriahasználati csúcs 1,23 GB.
Az alábbi példa egy két fürtcsomóponttal rendelkező fürt fejlesztését mutatja be egy 60 M rekordból álló táblával, ahol a join
kulcs számossága 2 M.
A lekérdezés hint.num_partitions
nélkül történő futtatása csak két partíciót használ (fürtcsomópontok számaként), és a következő lekérdezés ~1:10 percet vesz igénybe:
lineitem
| summarize dcount(l_comment), dcount(l_shipdate) by l_partkey
| join
hint.shufflekey = l_partkey part
on $left.l_partkey == $right.p_partkey
| consume
Amikor a partíciók számát 10-esre állítja, a lekérdezés 23 másodperc után befejeződik:
lineitem
| summarize dcount(l_comment), dcount(l_shipdate) by l_partkey
| join
hint.shufflekey = l_partkey hint.num_partitions = 10 part
on $left.l_partkey == $right.p_partkey
| consume