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 ofdcount()
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
, Resource1
en Resource2
nodig. 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))
Feedback
https://aka.ms/ContentUserFeedback.
Binnenkort beschikbaar: In de loop van 2024 zullen we GitHub-problemen geleidelijk uitfaseren als het feedbackmechanisme voor inhoud en deze vervangen door een nieuw feedbacksysteem. Zie voor meer informatie:Feedback verzenden en weergeven voor