Aracılığıyla paylaş


karıştırma sorgusu

Şunlar için geçerlidir: ✅Microsoft Fabric

Sorgu shuffle , stratejiyi destekleyen bir dizi işleçle kullanılan anlamsal koruma dönüşümüdür shuffle . İlgili verilere bağlı olarak, stratejiyle shuffle sorgulama daha iyi performans sağlayabilir. Anahtar (shuffleanahtar, anahtar, joinsummarize anahtar veya make-series anahtar) yüksek kardinaliteye sahip olduğunda partition ve normal işleç sorgusu sorgu sınırlarına ulaştığında karıştırma sorgu stratejisini kullanmak daha iyidir.

Karıştırma komutuyla aşağıdaki işleçleri kullanabilirsiniz:

Sorgu stratejisini shuffle kullanmak için veya hint.strategy = shuffleifadesini hint.shufflekey = <key> 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 kullanışlıdır.

Not

Birçok bölüm kullanmak daha fazla küme kaynağı tüketebilir ve performansı düşürebilir. ile hint.strategy = shuffle başlayarak bölüm numarasını dikkatlice seçin ve bölümleri aşamalı olarak artırmaya başlayın.

Bazı durumlarda, hint.strategy = shuffle yok sayılır ve sorgu stratejide shuffle çalışmaz. Bu, aşağıdaki durumlarda oluşabilir:

  • işlecinin join sol tarafında veya shufflesağ tarafında başka bir joinuyumlu işleci (summarize, make-seriespartition veya ) vardır.
  • İşleç summarize , sorguda başka bir shuffleuyumlu işleç (join, summarizeveya make-seriespartition) sonra görünür.

Sözdizimi

İle hint.strategy = shuffle

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

T|summarizehint.strategy = shuffle DataExpression

T|Sorgu| bölümü hint.strategy = shuffle(Alt Sorgusu)

Anahtarla hint.shufflekey =

T|DataExpression|joinhint.shufflekey = tuşu(DataExpression)

T|summarizehint.shufflekey = tuşuDataExpression

T|make-serieshint.shufflekey = tuşuDataExpression

T|Sorgu| bölüm hint.shufflekey = anahtarı(Alt Sorgusu)

Söz dizimi kuralları hakkında daha fazla bilgi edinin.

Parametreler

Ad Tür Zorunlu 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.
key string Anahtar join , anahtar, summarizemake-series anahtar veya partition anahtar kullanın.
Alt Sorgu string Dönüştürme ifadesi.

Not

Seçilen söz dizimine bağlı olarak DataExpression veya Query belirtilmelidir.

Örnekler

Bu bölümdeki örnekte, kullanmaya başlamanıza yardımcı olması için söz diziminin nasıl kullanılacağı gösterilmektedir.

Bu makaledeki örneklerde, Örnekleri veritabanındaki StormEvents tablosu gibi yardım kümesiiçindeki genel kullanıma açık tablolar kullanılır.

Bu makaledeki örneklerde, Weather analytics örnek veriiçindeki StormEvents tablosu gibi genel kullanıma açık tablolar kullanılır.

Karışık olarak ö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üğümlerindeki yükü paylaşır.

StormEvents
| summarize hint.strategy = shuffle count(), avg(InjuriesIndirect) by State
| count 

Çıktı

Sayı
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

Çıktı

Sayı
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

Çıktı

State sum_DamageProperty StartTime
KUZEY DAKOTA [60000,0,0] ["2006-12-31T00:00:00.0000000Z","2007-01-15T00:15T00:100:00.00000000Z","2007-01-30T00:00:00.0000000Z"]
NORTH CAROLINA [20000,0,1000] ["2006-12-31T00:00:00.0000000Z","2007-01-15T00:15T00:100:00.00000000Z","2007-01-30T00:00:00.0000000Z"]
ATLANTIK KUZEY [0,0,0] ["2006-12-31T00:00:00.0000000Z","2007-01-15T00:15T00:100:00.00000000Z","2007-01-30T00:00:00.0000000Z"]

Bölümü karıştırma ile kullanma

StormEvents
| partition hint.strategy=shuffle by EpisodeId
(
    top 3 by DamageProperty
    | project EpisodeId, State, DamageProperty
)
| count

Çıktı

Sayı
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

Çıktı

Sayı
14

Aşağıdaki sorguda kullanılır hint.shufflekey = key. Yukarıdaki sorgu bu sorguyla 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

Çıktı

Sayı
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ştirme sol tarafında özetlemiştir, 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

Çıktı

EpisodeId 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 summarize işlemleri için join ortak olan anahtarı seçin. Bu durumda, bu anahtar şeklindedir EpisodeId. üzerinde karıştırma anahtarını hint.shufflekeyjoinbelirtmek için ipucunu hint.shufflekey = EpisodeId 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

Çıktı

EpisodeId 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 summarizeshuffle kullanmak performansı artırır. Kaynak tabloda 150M kayıt vardır ve anahtara göre gruplandırma kardinalitesi 10 küme düğümüne yayılan 10M'dir.

Strateji olmadan summarize işleç kullanıldığında shuffle sorgu 1:08'in ardından sona erer ve bellek kullanımı en yüksek değeri yaklaşık 3 GB'tır:

orders
| summarize arg_max(o_orderdate, o_totalprice) by o_custkey 
| where o_totalprice < 1000
| count

Çıktı

Sayı
1086

ile shufflestrateji kullanılırken summarize sorgu yaklaşık 7 saniye sonra sona erer ve bellek kullanımı 0,43 GB olur:

orders
| summarize hint.strategy = shuffle arg_max(o_orderdate, o_totalprice) by o_custkey 
| where o_totalprice < 1000
| count

Çıktı

Sayı
1086

Aşağıdaki örnek, anahtara göre grup kardinalitesinin 2M olduğu, 60M kayıtları olan bir tabloyla iki küme düğümü olan bir kümede performansı gösterir.

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 numarası 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ç ile shuffle strateji kullanmanın 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 tablo, anahtarın kardinalitesinin join yaklaşık 14M olduğu 15M kayda sahiptir. Sorgunun sağ tarafındaki kaynakta 150M kayıt vardır 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 işleçle shuffle strateji kullanılırken join sorgu yaklaşık 4 saniye sonra sona erer ve bellek kullanımı 0,3 GB olur:

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ı deniyoruz:

  • öğ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 isabet eder ve zaman aşımına uğradı. Ancak, işleç ile shuffle strateji kullanılırken join sorgu yaklaşık 34 saniye sonra sona erer ve bellek kullanımı 1,23 GB olur.

Aşağıdaki örnekte iki küme düğümü olan ve anahtarın kardinalitesinin 2M olduğu 60M kayıt tablosuna 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 numarası 10 olarak ayarlandığında, 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