materialize()

Legt de waarde van een tabellaire expressie vast voor de duur van de queryuitvoering, zodat er meerdere keren naar kan worden verwezen door de query zonder herberekening.

Syntax

materialize(Expressie)

Meer informatie over syntaxisconventies.

Parameters

Naam Type Vereist Beschrijving
expression string ✔️ De tabellaire expressie die moet worden geëvalueerd en opgeslagen in de cache tijdens het uitvoeren van de query.

Opmerkingen

De materialize() functie is handig in de volgende scenario's:

  • Om query's te versnellen die zware berekeningen uitvoeren waarvan de resultaten meerdere keren in de query worden gebruikt.
  • Als u een tabellaire expressie slechts eenmaal wilt evalueren en deze vaak in een query wilt gebruiken. Dit is meestal vereist als de tabellaire expressie niet-deterministisch is. Als de expressie bijvoorbeeld de rand() functies of dcount() gebruikt.

Notitie

Materialize heeft een cachegroottelimiet van 5 GB. Deze limiet is per clusterknooppunt en geldt voor alle query's die gelijktijdig worden uitgevoerd. Als een query wordt gebruikt materialize() en de cache geen gegevens meer kan bevatten, wordt de query afgebroken met een fout.

Tip

Een andere manier om de materialisatie van tabellaire expressies uit te voeren, is met behulp van de hint.materialized vlag van de operator as en de partitieoperator. Ze delen allemaal één materialisatiecache.

Tip

  • Push alle mogelijke operators die de gerealiseerde gegevensset verminderen en de semantiek van de query behouden. Gebruik bijvoorbeeld algemene filters boven op dezelfde gerealiseerde expressie.
  • Gebruik Materialize met join of union wanneer hun operanden wederzijdse subquery's hebben die eenmaal kunnen worden uitgevoerd. Bijvoorbeeld join/union vorkpoten. Zie een voorbeeld van het gebruik van join-operator.
  • Materialize kan alleen worden gebruikt in let-instructies als u het resultaat in de cache een naam geeft. Zie voorbeeld van het gebruik van let-instructies).

Voorbeelden van verbetering van queryprestaties

In het volgende voorbeeld ziet u hoe materialize() u de prestaties van de query kunt verbeteren. De expressie _detailed_data wordt gedefinieerd met behulp van materialize() functie en wordt daarom slechts eenmaal berekend.

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

Uitvoer

Staat EventType EventPercentage gebeurtenis
HAWAII WATERS Waterspout 100 2
LAKE ONTARIO Marine Onweerswind 100 8
GOLF VAN ALASKA Waterspout 100 4
NOORD-ATLANTISCHE OCEAAN Marine Onweerswind 95.2127659574468 179
LAKE ERIE Marine Onweerswind 92.5925925925926 25
E PACIFIC Waterspout 90 9
LAKE MICHIGAN Marine Onweerswind 85.1648351648352 155
HURONMEER Marine Onweerswind 79.3650793650794 50
GOLF VAN MEXICO Marine Onweerswind 71.7504332755633 414
HAWAII Hoge surf 70.0218818380744 320

In het volgende voorbeeld wordt een set willekeurige getallen gegenereerd en wordt het volgende berekend:

  • Hoeveel afzonderlijke waarden in de set (Dcount)
  • De drie belangrijkste waarden in de set
  • De som van al deze waarden in de set

Deze bewerking kan worden uitgevoerd met behulp van batches en materialiseren:

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)

Resultatenset 1:

Dcount
2578351

Resultatenset 2:

waarde
9999998
9999998
9999997

Resultatenset 3:

Sum
15002960543563

Voorbeelden van het gebruik van materialize()

Tip

Materialiseer uw kolom tijdens opnametijd als de meeste query's velden extraheren uit dynamische objecten in miljoenen rijen.

Als u de let instructie wilt gebruiken met een waarde die u meer dan één keer gebruikt, gebruikt u de functie materialize(). Probeer alle mogelijke operators te pushen die de gerealiseerde gegevensset verminderen en toch de semantiek van de query behouden. Gebruik bijvoorbeeld filters of project alleen vereiste kolommen.

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

Het filter op Text is wederzijds en kan worden gepusht naar de materialiseerexpressie. De query heeft alleen kolommen Timestamp, Text, Resource1en Resource2nodig. Projecter deze kolommen in de gerealiseerde expressie.

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

Als de filters niet identiek zijn, zoals in de volgende query:

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

Wanneer het gecombineerde filter het gerealiseerde resultaat drastisch vermindert, combineert u beide filters op het gerealiseerde resultaat door een logische or expressie zoals in de volgende query. Behoud echter de filters in elke samenvoegingspoot om de semantiek van de query te behouden.

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