Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Van toepassing op: ✅Microsoft Fabric✅Azure Data Explorer✅Azure Monitor✅Microsoft Sentinel
Hiermee wordt de waarde van een tabellaire expressie vastgelegd voor de duur van de uitvoering van de query, zodat er meerdere keren naar kan worden verwezen door de query zonder herberekening.
Syntaxis
materialize(
uitdrukking)
Meer informatie over syntaxisconventies.
Parameterwaarden
| Naam | Typologie | Verplicht | Beschrijving |
|---|---|---|---|
| expressie | string |
✔️ | De tabellaire expressie die moet worden geëvalueerd en in de cache wordt opgeslagen tijdens het uitvoeren van query's. |
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 gebruikmaakt van de
rand()of dedcount()functies.
Opmerking
Materialize heeft een cachegrootte van 5 GB. Deze limiet is per clusterknooppunt en is wederzijds 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.
Aanbeveling
- Een andere manier om materialisatie van tabellaire expressies uit te voeren, is door de vlag van de
hint.materializedoperator als operator en partitieoperator te gebruiken. Ze delen allemaal één materialisatiecache. - 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 materialisatie met join of samenvoeging wanneer hun operanden wederzijdse subquery's hebben die eenmaal kunnen worden uitgevoerd. Bijvoorbeeld join/union vorkbenen. Zie het voorbeeld van het gebruik van de join-operator.
- Materialize kan alleen worden gebruikt in let-instructies als u het resultaat in de cache een naam geeft. Zie het voorbeeld van het gebruik van let-instructies).
Waarschuwing
Benchmark uw query's met en zonder materialize() om te zien of de prestaties voor uw gegevens en querypatronen worden verbeterd. In sommige gevallen kan materialize() het geheugengebruik verhogen zonder aanzienlijke prestatieverbeteringen te bieden, dus testen helpt u bij het kiezen van de beste benadering.
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() de functie en wordt daarom slechts één keer 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 | Type van evenement | EventPercentage | Evenementen |
|---|---|---|---|
| HAWAII WATERS | Waterhoos | 100 | 2 |
| LAKE ONTARIO | Marine Thunderstorm Wind | 100 | 8 |
| GOLF VAN ALASKA | Waterhoos | 100 | 4 |
| ATLANTISCHE NOORD | Marine Thunderstorm Wind | 95.2127659574468 | 179 |
| LAKE ERIE | Marine Thunderstorm Wind | 92.5925925925926 | vijfentwintig |
| E PACIFIC | Waterhoos | 90 | 9 |
| LAKE MICHIGAN | Marine Thunderstorm Wind | 85.1648351648352 | 155 |
| LAKE HURON | Marine Thunderstorm Wind | 79.3650793650794 | 50 |
| GOLF VAN MEXICO | Marine Thunderstorm Wind | 71.7504332755633 | 414 |
| HAWAÏ | Hoog surf | 70.0218818380744 | 320 |
In het volgende voorbeeld wordt een set willekeurige getallen gegenereerd en 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 materialiseer:
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:
| Aantal |
|---|
| 2578351 |
Resultatenset 2:
| waarde |
|---|
| 9999998 |
| 9999998 |
| 9999997 |
Resultatenset 3:
| Som |
|---|
| 15002960543563 |
Voorbeelden van het gebruik van materialize()
Aanbeveling
Materialiseer uw kolom tijdens opnametijd als de meeste query's velden uit dynamische objecten over miljoenen rijen extraheren. In dit scenario gebruikt u het overzicht van updatebeleid.
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 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 Text is wederzijds en kan worden gepusht naar de materialiseerexpressie.
De query heeft alleen kolommenTimestamp, Texten Resource1Resource2. 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 elk samenvoegbeen 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))