materialize()
Acquisisce il valore di un'espressione tabulare per la durata dell'esecuzione della query in modo che possa essere fatto riferimento più volte dalla query senza ricalcolo.
Sintassi
materialize(
expression)
Altre informazioni sulle convenzioni di sintassi.
Parametri
Nome | Tipo | Obbligatoria | Descrizione |
---|---|---|---|
expression | string |
✔️ | Espressione tabulare da valutare e memorizzare nella cache durante l'esecuzione della query. |
Commenti
La materialize()
funzione è utile negli scenari seguenti:
- Per velocizzare le query che eseguono calcoli pesanti i cui risultati vengono usati più volte nella query.
- Per valutare un'espressione tabulare una sola volta e usarla più volte in una query. Questa operazione è in genere necessaria se l'espressione tabulare non è deterministica. Ad esempio, se l'espressione usa le
rand()
funzioni odcount()
.
Nota
Materialize ha un limite di dimensioni della cache di 5 GB. Questo limite è per nodo del cluster ed è reciproco per tutte le query in esecuzione contemporaneamente. Se una query usa materialize()
e la cache non può contenere altri dati, la query interromperà con un errore.
Suggerimento
Un altro modo per eseguire la materializzazione dell'espressione tabulare consiste nell'usare il hint.materialized
flag dell'operatore as e dell'operatore di partizione. Tutti condividono una singola cache di materializzazione.
Suggerimento
- Eseguire il push di tutti gli operatori possibili che riducono il set di dati materializzato e mantengono la semantica della query. Ad esempio, usare filtri comuni sopra la stessa espressione materializzata.
- Usare la materializzazione con join o unione quando gli operandi hanno sottoquery reciproche che possono essere eseguite una sola volta. Ad esempio, unire/unire le gambe della forcella. Vedere l'esempio di uso dell'operatore join.
- Materialize può essere usato solo nelle istruzioni let se si assegna un nome al risultato memorizzato nella cache. Vedere l'esempio di uso delle istruzioni let.
Esempi di miglioramento delle prestazioni delle query
Nell'esempio seguente viene illustrato come materialize()
usare per migliorare le prestazioni della query.
L'espressione _detailed_data
viene definita usando la materialize()
funzione e pertanto viene calcolata una sola volta.
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
Output
State | EventType | EventPercentage | evento |
---|---|---|---|
ACQUE DELLE HAWAII | Tromba marina | 100 | 2 |
LAKE ONTARIO | Vento temporale marino | 100 | 8 |
GOLFO DELL'ALASKA | Tromba marina | 100 | 4 |
ATLANTICO NORD | Vento temporale marino | 95.2127659574468 | 179 |
LAGO ERIE | Vento temporale marino | 92.5925925925926 | 25 |
E PACIFIC | Tromba marina | 90 | 9 |
LAGO MICHIGAN | Vento temporale marino | 85.1648351648352 | 155 |
LAGO HURON | Vento temporale marino | 79.3650793650794 | 50 |
GOLFO DEL MESSICO | Vento temporale marino | 71.7504332755633 | 414 |
HAWAII | High Surf | 70.0218818380744 | 320 |
L'esempio seguente genera un set di numeri casuali e calcola:
- Numero di valori distinti nel set (
Dcount
) - I primi tre valori nel set
- Somma di tutti questi valori nel set
Questa operazione può essere eseguita usando batch e materializza:
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)
Set di risultati 1:
Dcount |
---|
2578351 |
Set di risultati 2:
Valore |
---|
9999998 |
9999998 |
9999997 |
Set di risultati 3:
Sum |
---|
15002960543563 |
Esempi di uso di materialize()
Suggerimento
Materializzare la colonna in fase di inserimento se la maggior parte delle query estrae campi da oggetti dinamici su milioni di righe.
Per usare l'istruzione let
con un valore usato più di una volta, usare la funzione materialize(). Provare a eseguire il push di tutti gli operatori possibili che riducono il set di dati materializzato e mantengono comunque la semantica della query. Ad esempio, usare filtri o solo colonne necessarie per il progetto.
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))
Il filtro su Text
è reciproco e può essere eseguito il push nell'espressione di materializza.
La query richiede solo colonne Timestamp
, Text
, Resource1
e Resource2
. Proiettare queste colonne all'interno dell'espressione materializzata.
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))
Se i filtri non sono identici, come nella query seguente:
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))
Quando il filtro combinato riduce drasticamente il risultato materializzato, combinare entrambi i filtri sul risultato materializzato da un'espressione logica or
come nella query seguente. Tuttavia, mantenere i filtri in ogni gamba dell'unione per mantenere la semantica della query.
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))
Commenti e suggerimenti
https://aka.ms/ContentUserFeedback.
Presto disponibile: Nel corso del 2024 verranno gradualmente disattivati i problemi di GitHub come meccanismo di feedback per il contenuto e ciò verrà sostituito con un nuovo sistema di feedback. Per altre informazioni, vedereInvia e visualizza il feedback per