materialize()

Rögzíti egy táblázatos kifejezés értékét a lekérdezés végrehajtásának időtartamára, hogy a lekérdezés újraszámítás nélkül többször hivatkozzon rá.

Syntax

materialize(Kifejezés)

További információ a szintaxis konvenciókról.

Paraméterek

Név Típus Kötelező Leírás
expression string ✔️ A lekérdezés végrehajtása során kiértékelendő és gyorsítótárazandó táblázatos kifejezés.

Megjegyzések

A materialize() függvény a következő esetekben hasznos:

  • Felgyorsíthatja azokat a lekérdezéseket, amelyek olyan nagy számítási feladatokat végeznek, amelyek eredményeit többször használják fel a lekérdezésben.
  • Ha csak egyszer szeretne kiértékelni egy táblázatos kifejezést, és többször is használni szeretné egy lekérdezésben. Ez általában akkor szükséges, ha a táblázatos kifejezés nem determinisztikus. Ha például a kifejezés a rand() vagy a függvényt dcount() használja.

Megjegyzés

A Materialize gyorsítótárméretkorlátja 5 GB. Ez a korlát fürtcsomópontonként van, és az egyidejűleg futó összes lekérdezés esetében kölcsönös. Ha egy lekérdezés használ materialize() , és a gyorsítótár nem tud több adatot tárolni, a lekérdezés egy hibával megszakad.

Tipp

A táblázatos kifejezések materializálásának másik módja az hint.materializedoperátorként és partícióoperátorként használt jelző használata. Mindegyiknek egyetlen materializációs gyorsítótára van.

Tipp

  • Küldje le az összes lehetséges operátort, amely csökkenti a materializált adathalmazt, és megtartja a lekérdezés szemantikáját. Használjon például gyakori szűrőket ugyanarra a materializált kifejezésre.
  • Ha operandusaik kölcsönös al lekérdezésekkel rendelkeznek, akkor az illesztéssel vagy az egyesítéssel való materializálást akkor érdemes használni, ha az operandusok egyszer hajthatók végre. Például illesztés/egyesítő elágazás lábak. Lásd a join operátor használatát szemléltető példát.
  • A Materialize csak akkor használható a let utasításokban, ha nevet ad a gyorsítótárazott eredménynek. Lásd a let utasítások használatát ismertető példát).

Példák a lekérdezési teljesítmény javítására

Az alábbi példa bemutatja, hogyan materialize() javítható a lekérdezés teljesítménye. A kifejezés _detailed_data függvény használatával materialize() van definiálva, ezért csak egyszer lesz kiszámítva.

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

Kimenet

Állapot EventType EventPercentage esemény
HAWAII VIZEK Vízspout 100 2
ONTARIO-TÓ Tengeri zivatar szél 100 8
ALASZKAI-ÖBÖL Vízspout 100 4
ATLANTI-ÓCEÁN ÉSZAKI RÉGIÓJA Tengeri zivatar szél 95.2127659574468 179
TÓ ERIE Tengeri zivatar szél 92.5925925925926 25
CSENDES-ÓCEÁNI TÉRSÉG Vízspout 90 9
MICHIGAN-TÓ Tengeri zivatar szél 85.1648351648352 155
HURON-TÓ Tengeri zivatar szél 79.3650793650794 50
MEXIKÓI-ÖBÖL Tengeri zivatar szél 71.7504332755633 414
HAWAII High Surf 70.0218818380744 320

Az alábbi példa véletlenszerű számokból álló készletet hoz létre, és kiszámítja a következőket:

  • Hány különböző érték van a készletben (Dcount)
  • A készlet első három értéke
  • A készletben lévő összes érték összege

Ez a művelet kötegekkel végezhető el, és a következőket valósíthatja meg:

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)

Eredményhalmaz 1:

Dcount
2578351

Eredményhalmaz 2:

érték
9999998
9999998
9999997

Eredményhalmaz 3:

Sum
15002960543563

Példák materialize() használatára

Tipp

Ha a lekérdezések többsége dinamikus objektumokból több millió sorból nyer ki mezőket, a betöltési időben materializálja az oszlopot.

Ha egynél többször használt értékkel szeretné használni az let utasítást, használja a materialize() függvényt. Próbálja meg leküldni az összes lehetséges operátort, amely csökkenti a materializált adathalmazt, és továbbra is megőrzi a lekérdezés szemantikáját. Használjon például szűrőket, vagy csak a szükséges oszlopokat projektelje ki.

    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))

A szűrő kölcsönös Text , és leküldhető a materializált kifejezésre. A lekérdezésnek csak oszlopra Timestamp, Text, Resource1és Resource2oszlopra van szüksége. Ezeket az oszlopokat a materializált kifejezésen belül kivetíti.

    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))

Ha a szűrők nem azonosak, mint az alábbi lekérdezésben:

    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))

Ha az egyesített szűrő drasztikusan csökkenti a materializált eredményt, kombinálja mindkét szűrőt a materializált eredményen egy logikai or kifejezéssel, mint az alábbi lekérdezésben. Tartsa azonban a szűrőket minden egyes egyesítő lábban, hogy megőrizze a lekérdezés szemantikáját.

    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))