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 o dcount() .

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