materialize()
Si applica a: ✅Microsoft Fabric✅Azure Esplora dati✅ Azure Monitor✅Microsoft Sentinel
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 | Digita | Obbligatorio | Descrizione |
---|---|---|---|
expression | string |
✔️ | Espressione tabulare da valutare e memorizzare nella cache durante l'esecuzione della query. |
Osservazioni:
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 obbligatoria 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 simultaneamente. 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 e dell'operatore partition. 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 materializzarsi con join o unione quando gli operandi hanno sottoquery reciproca che possono essere eseguite una sola volta. Ad esempio, unire/unire le gambe. 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
Provincia | EventType | EventPercentage | Eventi |
---|---|---|---|
HAWAII WATERS | Tromba marina | 100 | 2 |
LAGO ONTARIO | Vento temporale marino | 100 | 8 |
GOLFO DELL'ALASKA | Tromba marina | 100 | 4 |
ATLANTICO SETTENTRIONALE | 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:
value |
---|
9999998 |
9999998 |
9999997 |
Set di risultati 3:
Sum |
---|
15002960543563 |
Esempi di utilizzo 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ù volte, usare la funzione materialize(). Provare a eseguire il push di tutti i possibili operatori che ridurranno il set di dati materializzato e mantengono comunque la semantica della query. Ad esempio, usare i filtri o proiettare solo le colonne necessarie.
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 inserito nell'espressione di materializzazione.
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 sezione 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))