shuffle sorgusu
Sorgu shuffle
, stratejiyi destekleyen bir işleç kümesiyle kullanılan semantik koruma dönüşümüdür shuffle
. İlgili verilere bağlı olarak, stratejiyle shuffle
sorgulama daha iyi performans sağlayabilir. Anahtar (join
anahtar, anahtar, make-series
summarize
anahtar veya partition
anahtar) yüksek kardinaliteye sahip olduğunda shuffle
ve normal işleç sorgusu sorgu sınırlarına ulaştığında karıştırma sorgu stratejisini kullanmak daha iyidir.
Shuffle komutuyla aşağıdaki işleçleri kullanabilirsiniz:
Sorgu stratejisini shuffle
kullanmak için veya hint.shufflekey = <key>
ifadesini hint.strategy = shuffle
ekleyin. kullandığınızda hint.strategy=shuffle
, işleç verileri tüm anahtarlar tarafından karıştırılır. Bileşik anahtar benzersiz olduğunda ancak her anahtar yeterince benzersiz olmadığında bu ifadeyi kullanın, bu nedenle karıştırılmış işlecin tüm anahtarlarını kullanarak verileri karıştıracaksınız.
Verileri karıştırma stratejisiyle bölümlere ayırırken, veri yükü tüm küme düğümlerinde paylaşılır. Her düğüm verilerin bir bölümünü işler. Varsayılan bölüm sayısı, küme düğümlerinin sayısına eşittir.
Bölüm numarası, bölüm sayısını denetleyen söz dizimi hint.num_partitions = total_partitions
kullanılarak geçersiz kılınabilir. Bu, kümede az sayıda küme düğümü olduğunda ve varsayılan bölüm sayısı küçük olduğunda ve sorgu başarısız olduğunda veya uzun bir yürütme süresi aldığında yararlıdır.
Not
Birçok bölüm kullanmak daha fazla küme kaynağı tüketebilir ve performansı düşürebilir. ile başlayıp hint.strategy = shuffle
bölümleri kademeli olarak artırmaya başlayarak bölüm numarasını dikkatle seçin.
Bazı durumlarda, hint.strategy = shuffle
yok sayılır ve sorgu stratejide shuffle
çalışmaz. Bu durum şu durumlarda oluşabilir:
- İşlecin
join
sol tarafında veyapartition
sağ tarafında başka birshuffle
uyumlu işleç (join
,summarize
,make-series
veya ) vardır. - işleci,
summarize
sorguda başka birshuffle
uyumlu işleç (join
,summarize
make-series
veyapartition
) sonra görünür.
Syntax
Ile hint.strategy
= shuffle
T|
DataExpression|
join
hint.strategy
= shuffle
(
DataExpression)
T|
summarize
hint.strategy
= shuffle
DataExpression
T|
Sorgu|
partition hint.strategy
(
= shuffle
SubQuery)
Anahtar ile hint.shufflekey
=
T|
DataExpression|
join
hint.shufflekey
= Anahtar(
DataExpression)
T|
summarize
hint.shufflekey
= keyDataExpression
T|
make-series
hint.shufflekey
= keyDataExpression
T|
Sorgu|
bölüm hint.shufflekey
= anahtarı(
Alt Sorgu)
Söz dizimi kuralları hakkında daha fazla bilgi edinin.
Parametreler
Ad | Tür | Gerekli | Açıklama |
---|---|---|---|
T | string |
✔️ | Verileri işleç tarafından işlenecek tablosal kaynak. |
DataExpression | string |
Örtük veya açık bir tablosal dönüşüm ifadesi. | |
Sorgu | string |
T kayıtlarında bir dönüştürme ifadesi çalıştırılır. | |
Anahtar | string |
join Anahtar, summarize anahtar, make-series anahtar veya partition anahtar kullanın. |
|
Subquery | string |
Dönüştürme ifadesi. |
Not
Seçilen söz dizimine bağlı olarak DataExpression veya Query belirtilmelidir.
Örnekler
Karıştırma ile özetle özelliğini kullanma
shuffle
işleci ile summarize
strateji sorgusu, her düğümün verilerin bir bölümünü işlediği tüm küme düğümlerinde yükü paylaşır.
StormEvents
| summarize hint.strategy = shuffle count(), avg(InjuriesIndirect) by State
| count
Çıkış
Count |
---|
67 |
Karıştırma ile birleştirmeyi kullanma
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
Çıkış
Count |
---|
103 |
Karıştırma ile make-series kullanma
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
Çıkış
Durum | sum_DamageProperty | StartTime |
---|---|---|
NORTH DAKOTA | [60000,0,0] | ["2006-12-31T00:00:00.0000000Z","2007-01-15T00:100:00.0000000Z","2007-01-30T00:00:00.0000000Z"] |
KUZEY CAROLINA | [20000,0,1000] | ["2006-12-31T00:00:00.0000000Z","2007-01-15T00:100:00.0000000Z","2007-01-30T00:00:00.0000000Z"] |
ATLANTIC NORTH | [0,0,0] | ["2006-12-31T00:00:00.0000000Z","2007-01-15T00:100:00.0000000Z","2007-01-30T00:00:00.0000000Z"] |
Karıştırma ile bölüm kullanma
StormEvents
| partition hint.strategy=shuffle by EpisodeId
(
top 3 by DamageProperty
| project EpisodeId, State, DamageProperty
)
| count
Çıkış
Count |
---|
22345 |
hint.strategy=shuffle ve hint.shufflekey=key karşılaştırması
kullandığınızda hint.strategy=shuffle
, karıştırılan işleç tüm anahtarlar tarafından karıştırılır. Aşağıdaki örnekte sorgu, hem hem de EpisodeId
EventId
anahtar olarak kullanarak verileri karıştırıyor:
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
Çıkış
Count |
---|
14 |
Aşağıdaki sorguda kullanılır hint.shufflekey = key
. Yukarıdaki sorgu bu sorguya eşdeğerdir.
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
Çıkış
Count |
---|
14 |
Verileri birden çok anahtarla karıştırma
Bazı durumlarda, hint.strategy=shuffle
yok sayılır ve sorgu karıştırma stratejisinde çalışmaz. Örneğin, aşağıdaki örnekte birleştirmenin sol tarafında özetleme vardır, bu nedenle kullanımı hint.strategy=shuffle
sorguya karıştırma stratejisi uygulamaz:
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
Çıkış
Bölüm Kimliği | EventId | ... | EpisodeId1 | EventId1 | ... |
---|---|---|---|---|---|
1030 | 4407 | ... | 1030 | 4407 | ... |
1030 | 13721 | ... | 1030 | 13721 | ... |
2477 | 12530 | ... | 2477 | 12530 | ... |
2103 | 10237 | ... | 2103 | 10237 | ... |
2103 | 10239 | ... | 2103 | 10239 | ... |
... | ... | ... | ... | ... | ... |
Bu sorunun üstesinden gelmek ve karıştırma stratejisinde çalıştırmak için ve join
işlemleri için summarize
ortak olan anahtarı seçin. Bu durumda, bu anahtar şeklindedir EpisodeId
. üzerinde karıştırma anahtarını join
belirtmek için hint.shufflekey = EpisodeId
ipucunu hint.shufflekey
kullanın:
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
Çıkış
Bölüm Kimliği | EventId | ... | EpisodeId1 | EventId1 | ... |
---|---|---|---|---|---|
1030 | 4407 | ... | 1030 | 4407 | ... |
1030 | 13721 | ... | 1030 | 13721 | ... |
2477 | 12530 | ... | 2477 | 12530 | ... |
2103 | 10237 | ... | 2103 | 10237 | ... |
2103 | 10239 | ... | 2103 | 10239 | ... |
... | ... | ... | ... | ... | ... |
Performansı geliştirmek için karıştırma ile özetleme özelliğini kullanma
Bu örnekte, işleci stratejiyle summarize
kullanmak shuffle
performansı artırır. Kaynak tabloda 150M kaydı vardır ve gruplandırma ölçütü anahtarının kardinalitesi 10M'dir ve bu da 10 küme düğümüne yayılır.
İşleci strateji olmadan shuffle
kullanarak summarize
sorgu 1:08'in ardından sona erer ve bellek kullanımı en yüksek değer yaklaşık 3 GB'tır:
orders
| summarize arg_max(o_orderdate, o_totalprice) by o_custkey
| where o_totalprice < 1000
| count
Çıkış
Count |
---|
1086 |
ile summarize
strateji kullanılırken shuffle
sorgu yaklaşık 7 saniye sonra sona erer ve bellek kullanımı 0,43 GB'tır:
orders
| summarize hint.strategy = shuffle arg_max(o_orderdate, o_totalprice) by o_custkey
| where o_totalprice < 1000
| count
Çıkış
Count |
---|
1086 |
Aşağıdaki örnekte, anahtara göre grup kardinalitesinin 2M olduğu, 60 milyon kayıt içeren bir tabloyla iki küme düğümüne sahip bir kümede performans gösterilmektedir.
Sorguyu olmadan hint.num_partitions
çalıştırmak yalnızca iki bölüm (küme düğüm numarası olarak) kullanır ve aşağıdaki sorgu yaklaşık 1:10 dakika sürer:
lineitem
| summarize hint.strategy = shuffle dcount(l_comment), dcount(l_shipdate) by l_partkey
| consume
Bölüm sayısı 10 olarak ayarlanırsa, sorgu 23 saniye sonra sona erer:
lineitem
| summarize hint.strategy = shuffle hint.num_partitions = 10 dcount(l_comment), dcount(l_shipdate) by l_partkey
| consume
Performansı geliştirmek için karıştırma ile birleştirmeyi kullanma
Aşağıdaki örnekte, işleçle strateji kullanmanın shuffle
join
performansı nasıl geliştirdiği gösterilmektedir.
Örnekler, verilerin tüm bu düğümlere yayıldığı 10 düğüme sahip bir kümede örneklendi.
Sorgunun sol tarafındaki kaynak tablosunda anahtarın kardinalitesinin join
~14M olduğu 15M kayıtları vardır. Sorgunun sağ tarafındaki kaynak 150M kayda sahiptir ve anahtarın join
kardinalitesi 10M'dir. Sorgu yaklaşık 28 saniye sonra sona erer ve bellek kullanımı 1,43 GB'tır:
customer
| join
orders
on $left.c_custkey == $right.o_custkey
| summarize sum(c_acctbal) by c_nationkey
Bir join
işleçle strateji kullanılırken shuffle
sorgu yaklaşık 4 saniye sonra sona erer ve bellek kullanımı 0,3 GB'tır:
customer
| join
hint.strategy = shuffle orders
on $left.c_custkey == $right.o_custkey
| summarize sum(c_acctbal) by c_nationkey
Başka bir örnekte, aşağıdaki koşullara sahip daha büyük bir veri kümesinde aynı sorguları deneriz:
- öğesinin
join
sol tarafındaki kaynak 150M, anahtarın kardinalitesi ise 148M'dir. - sağ tarafındaki kaynak
join
1,5B ve anahtarın kardinalitesi ~100M'dir.
Yalnızca işleci olan join
sorgu 4 dakika sonra sınırlara ve zaman aşımına uğradı. Ancak, işleç ile join
strateji kullanılırken shuffle
sorgu yaklaşık 34 saniye sonra sona erer ve bellek kullanımı 1,23 GB'tır.
Aşağıdaki örnekte, anahtarın kardinalitesinin 2M olduğu, 60 milyon kayıt içeren iki küme düğümüne sahip bir kümedeki join
iyileştirme gösterilmektedir.
Sorguyu olmadan hint.num_partitions
çalıştırmak yalnızca iki bölüm (küme düğüm numarası olarak) kullanır ve aşağıdaki sorgu yaklaşık 1:10 dakika sürer:
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
Bölüm sayısını 10 olarak ayarlarken sorgu 23 saniye sonra sona erer:
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
Geri Bildirim
https://aka.ms/ContentUserFeedback.
Çok yakında: 2024 boyunca, içerik için geri bildirim mekanizması olarak GitHub Sorunları’nı kullanımdan kaldıracak ve yeni bir geri bildirim sistemiyle değiştireceğiz. Daha fazla bilgi için bkz.Gönderin ve geri bildirimi görüntüleyin