Optimiser les requêtes utilisant des expressions nommées

Cet article explique comment optimiser l’utilisation répétée d’expressions nommées dans une requête.

En Langage de requête Kusto, vous pouvez lier des noms à des expressions complexes de plusieurs façons :

Lorsque vous référencez ces expressions nommées dans une requête, les étapes suivantes se produisent :

  1. Le calcul dans l’expression nommée est évalué. Ce calcul produit une valeur scalaire ou tabulaire.
  2. L’expression nommée est remplacée par la valeur calculée.

Si le même nom lié est utilisé plusieurs fois, le calcul sous-jacent est répété plusieurs fois. Quand cela devient-il problématique ?

  • Lorsque les calculs consomment de nombreuses ressources et sont utilisés plusieurs fois.
  • Lorsque le calcul n’est pas déterministe, mais que la requête suppose que tous les appels retournent la même valeur.

Limitation des risques

Pour atténuer ces problèmes, vous pouvez matérialiser les résultats de calcul en mémoire pendant la requête. Selon la façon dont le calcul nommé est défini, vous allez utiliser différentes stratégies de matérialisation :

Fonctions tabulaires

Utilisez les stratégies suivantes pour des fonctions tabulaires :

  • let, instructions et paramètres de fonction : utilisez la fonction materialize().
  • en tant qu’opérateur : définissez la valeur de l’indicateur hint.materialized sur true.

Par exemple, la requête suivante utilise l’exemple d’opérateur tabulaire non déterministe :

Notes

Les tables n’étant pas triées en général, toute référence de table dans une requête est, par définition, non déterministe.

Comportement sans utilisation de la fonction materialize

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

Sortie

x
63
92

Comportement sans la fonction materialize

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

Sortie

x
95
95

Fonctions scalaires

Des fonctions scalaires non déterministes peuvent être forcées à calculer exactement une fois à l’aide de toscalar().

Par exemple, la requête suivante utilise la fonction non déterministe rand() :

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

Sortie

print_0 print_1 print_2 print_3
166 137 70 70