Share via


materialize()

Sorgu yürütmesi süresince tablosal ifadenin değerini yakalar, böylece sorgu tarafından yeniden hesaplama yapılmadan birden çok kez başvurulabilmesini sağlar.

Syntax

materialize(Ifa -de)

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

Parametreler

Ad Tür Gerekli Açıklama
expression string ✔️ Sorgu yürütme sırasında değerlendirilecek ve önbelleğe alınacak tablosal ifade.

Açıklamalar

materialize() işlevi aşağıdaki senaryolarda yararlıdır:

  • Sonuçları sorguda birden çok kez kullanılan ağır hesaplamalar yapan sorguları hızlandırmak için.
  • Tablosal ifadeyi yalnızca bir kez değerlendirmek ve sorguda birçok kez kullanmak için. Bu genellikle tablosal ifade belirlenici değilse gereklidir. Örneğin, ifade veya dcount() işlevlerini kullanıyorsarand().

Not

Materialize'ın önbellek boyutu sınırı 5 GB'tır. Bu sınır küme düğümü başınadır ve eşzamanlı olarak çalıştırılan tüm sorgular için karşılıklıdır. Sorgu kullanıyorsa materialize() ve önbellek daha fazla veri tutamıyorsa sorgu bir hatayla durdurulacaktır.

İpucu

Tablosal ifadenin gerçekleştirilmesini gerçekleştirmenin bir diğer yolu da as işleci ve hint.materializedbölüm işleci bayrağını kullanmaktır. Hepsi tek bir gerçekleştirme önbelleğini paylaşır.

İpucu

  • Gerçekleştirilmiş veri kümesini azaltan ve sorgunun semantiğini tutan tüm olası işleçleri gönderme. Örneğin, aynı gerçekleştirilmiş ifadenin üzerinde ortak filtreler kullanın.
  • İşlenenleri bir kez yürütülebilen karşılıklı alt sorgulara sahip olduğunda birleştirme veya birleşim ile gerçekleştirme özelliğini kullanın. Örneğin, çatal bacakları birleştirme/birleştirme. Bkz. join işleci kullanma örneği.
  • Materialize yalnızca önbelleğe alınan sonuca bir ad verirseniz let deyimlerinde kullanılabilir. Bkz. let deyimlerini kullanma örneği).

Sorgu performansı geliştirme örnekleri

Aşağıdaki örnek, sorgunun performansını artırmak için nasıl materialize() kullanılabileceğini gösterir. İfade _detailed_data işlevi kullanılarak materialize() tanımlanır ve bu nedenle yalnızca bir kez hesaplanır.

let _detailed_data = materialize(StormEvents | summarize Events=count() by State, EventType);
_detailed_data
| summarize TotalStateEvents=sum(Events) by State
| join (_detailed_data) on State
| extend EventPercentage = Events*100.0 / TotalStateEvents
| project State, EventType, EventPercentage, Events
| top 10 by EventPercentage

Çıkış

Durum Olay türü EventPercentage Ekinlikler
HAWAII SULARı Su Borusu 100 2
ONTARIO GÖLÜ Deniz Fırtına Rüzgarı 100 8
ALASKA KÖRFEZI Su Borusu 100 4
KUZEY ATLANTIK Deniz Fırtına Rüzgarı 95.2127659574468 179
ERIE GÖLÜ Deniz Fırtına Rüzgarı 92.5925925925926 25
E PASIFIK Su Borusu 90 9
MICHIGAN GÖLÜ Deniz Fırtına Rüzgarı 85.1648351648352 155
HURON GÖLÜ Deniz Fırtına Rüzgarı 79.3650793650794 50
MEKSIKA KÖRFEZI Deniz Fırtına Rüzgarı 71.7504332755633 414
HAWAİİ Yüksek Sörf 70.0218818380744 320

Aşağıdaki örnek bir rastgele sayı kümesi oluşturur ve hesaplar:

  • Kümede kaç ayrı değer (Dcount)
  • Kümedeki ilk üç değer
  • Kümedeki tüm bu değerlerin toplamı

Bu işlem toplu işlemler kullanılarak gerçekleştirilebilir ve gerçekleştirilebilir:

let randomSet = 
    materialize(
        range x from 1 to 3000000 step 1
        | project value = rand(10000000));
randomSet | summarize Dcount=dcount(value);
randomSet | top 3 by value;
randomSet | summarize Sum=sum(value)

Sonuç kümesi 1:

Dcount
2578351

Sonuç kümesi 2:

değer
9999998
9999998
9999997

Sonuç kümesi 3:

Sum
15002960543563

materialize() kullanma örnekleri

İpucu

Sorgularınızın çoğu milyonlarca satırdaki dinamik nesnelerden alan ayıklarsa, veri alımı sırasında sütununuzu gerçekleştirin.

deyimini let birden çok kez kullandığınız bir değerle kullanmak için materialize() işlevini kullanın. Gerçekleştirilmiş veri kümesini azaltacak ve sorgunun semantiğini kullanmaya devam edecek tüm olası işleçleri göndermeyi deneyin. Örneğin, filtreleri kullanın veya yalnızca gerekli sütunları projeleyin.

    let materializedData = materialize(Table
    | where Timestamp > ago(1d));
    union (materializedData
    | where Text !has "somestring"
    | summarize dcount(Resource1)), (materializedData
    | where Text !has "somestring"
    | summarize dcount(Resource2))

üzerindeki Text filtre karşılıklıdır ve gerçekleştirilmiş ifadeye gönderilebilir. Sorgu yalnızca , , TextResource1ve Resource2sütunlarına Timestampihtiyaç duyar. Bu sütunları gerçekleştirilmiş ifade içinde yansıtın.

    let materializedData = materialize(Table
    | where Timestamp > ago(1d)
    | where Text !has "somestring"
    | project Timestamp, Resource1, Resource2, Text);
    union (materializedData
    | summarize dcount(Resource1)), (materializedData
    | summarize dcount(Resource2))

Filtreler aşağıdaki sorguda olduğu gibi aynı değilse:

    let materializedData = materialize(Table
    | where Timestamp > ago(1d));
    union (materializedData
    | where Text has "String1"
    | summarize dcount(Resource1)), (materializedData
    | where Text has "String2"
    | summarize dcount(Resource2))

Birleştirilmiş filtre gerçekleştirilmiş sonucu önemli ölçüde azalttığında, aşağıdaki sorguda olduğu gibi, gerçekleştirilmiş sonuç üzerindeki her iki filtreyi mantıksal or bir ifadeyle birleştirin. Ancak, sorgunun semantiğini korumak için filtreleri her birleşim bacağında tutun.

    let materializedData = materialize(Table
    | where Timestamp > ago(1d)
    | where Text has "String1" or Text has "String2"
    | project Timestamp, Resource1, Resource2, Text);
    union (materializedData
    | where Text has "String1"
    | summarize dcount(Resource1)), (materializedData
    | where Text has "String2"
    | summarize dcount(Resource2))