Elnevezett kifejezéseket használó lekérdezések optimalizálása

Ez a cikk azt ismerteti, hogyan optimalizálhatja a névvel ellátott kifejezések ismételt használatát egy lekérdezésben.

A Kusto lekérdezésnyelv többféleképpen is köthet neveket összetett kifejezésekhez:

Amikor egy lekérdezésben hivatkozik ezekre a névvel ellátott kifejezésekre, a következő lépések történnek:

  1. A névvel ellátott kifejezésen belüli számítás kiértékelése történik. Ez a számítás skaláris vagy táblázatos értéket eredményez.
  2. A névvel ellátott kifejezés helyébe a számított érték lép.

Ha ugyanazt a kötött nevet többször használja a rendszer, akkor a mögöttes számítás többször is ismétlődik. Mikor van ez aggodalomra ad okot?

  • Ha a számítások sok erőforrást használnak fel, és sokszor használják.
  • Ha a számítás nem determinisztikus, de a lekérdezés feltételezi, hogy az összes meghívás ugyanazt az értéket adja vissza.

Kockázatcsökkentés

Ezeknek a problémáknak a mérséklése érdekében a lekérdezés során a számítási eredményeket a memóriában is felhasználhatja. A névvel ellátott számítás definiálásának módjától függően különböző materializálási stratégiákat fog használni:

Táblázatos függvények

Táblázatos függvényekhez használja az alábbi stratégiákat:

  • let utasítások és függvényparaméterek: Használja a materialize() függvényt.
  • operátorként: Állítsa a tipp értékét a hint.materialized értékre true.

A következő lekérdezés például a nem determinisztikus táblázatos mintaoperátort használja:

Megjegyzés

A táblák nincsenek általában rendezve, így a lekérdezések bármely táblahivatkozása definíció szerint nem determinisztikus.

Viselkedés a materializálási függvény használata nélkül

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

Kimenet

x
63
92

Viselkedés a materializál függvény használatával

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

Kimenet

x
95
95

Skaláris függvények

A nem determinisztikus skaláris függvényeket a toscalar() használatával pontosan egyszer kell kiszámítani.

A következő lekérdezés például a rand() nem determinisztikus függvényt használja:

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

Kimenet

print_0 print_1 print_2 print_3
166 137 70 70