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 (joinanahtar, anahtar, make-seriessummarize 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_partitionskullanı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 veya partitionsağ tarafında başka bir shuffleuyumlu işleç (join, summarize, make-series veya ) vardır.
  • işleci, summarize sorguda başka bir shuffleuyumlu işleç (join, summarizemake-series veya partition) sonra görünür.

Syntax

Ile hint.strategy = shuffle

T|DataExpression|joinhint.strategy = shuffle(DataExpression)

T|summarizehint.strategy = shuffleDataExpression

T|Sorgu| partition hint.strategy( = shuffleSubQuery)

Anahtar ile hint.shufflekey =

T|DataExpression|joinhint.shufflekey = Anahtar(DataExpression)

T|summarizehint.shufflekey = keyDataExpression

T|make-serieshint.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 EpisodeIdEventId 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 = EpisodeIdipucunu 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 summarizestrateji 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 shufflejoin 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