Ottimizzare le query che usano espressioni denominate

Questo articolo illustra come ottimizzare l'uso di espressioni denominate in una query.

In Linguaggio di query Kusto è possibile associare nomi a espressioni complesse in diversi modi:

Quando si fa riferimento a queste espressioni denominate in una query, si verificano i passaggi seguenti:

  1. Il calcolo all'interno dell'espressione denominata viene valutato. Questo calcolo produce un valore scalare o tabulare.
  2. L'espressione denominata viene sostituita con il valore calcolato.

Se lo stesso nome associato viene usato più volte, il calcolo sottostante verrà ripetuto più volte. Quando si tratta di una preoccupazione?

  • Quando i calcoli usano molte risorse e vengono usati molte volte.
  • Quando il calcolo non è deterministico, ma la query presuppone che tutte le chiamate restituiscano lo stesso valore.

Strategia di riduzione del rischio

Per attenuare questi problemi, è possibile materializzare i risultati del calcolo in memoria durante la query. A seconda del modo in cui viene definito il calcolo denominato, si useranno strategie di materializzazione diverse:

Funzioni tabulari

Usare le strategie seguenti per le funzioni tabulari:

  • istruzioni let e parametri di funzione: usare la funzione materialize().
  • come operatore: impostare il hint.materialized valore hint su true.

Ad esempio, la query seguente usa l'operatore di esempio tabulare non deterministico:

Nota

Le tabelle non vengono ordinate in generale, quindi qualsiasi riferimento di tabella in una query è, per definizione, non deterministico.

Comportamento senza usare la funzione di materializzazione

range x from 1 to 100 step 1
| sample 1
| as T
| union T

Output

x
63
92

Comportamento usando la funzione di materializzazione

range x from 1 to 100 step 1
| sample 1
| as hint.materialized=true T
| union T

Output

x
95
95

Funzioni scalari

Le funzioni scalari non deterministiche possono essere costrette a calcolare esattamente una volta usando toscalar().

Ad esempio, la query seguente usa la funzione non deterministica, rand():

let x = () {rand(1000)};
let y = () {toscalar(rand(1000))};
print x, x, y, y

Output

print_0 print_1 print_2 print_3
166 137 70 70