Optimalizace dotazů, které používají pojmenované výrazy

Tento článek popisuje, jak optimalizovat opakované použití pojmenovaných výrazů v dotazu.

V dotazovací jazyk Kusto můžete názvy se složitými výrazy svázat několika různými způsoby:

Když v dotazu odkazujete na tyto pojmenované výrazy, proveďte následující kroky:

  1. Vyhodnocuje se výpočet v rámci pojmenovaného výrazu. Tento výpočet vytvoří skalární nebo tabulkovou hodnotu.
  2. Pojmenovaný výraz se nahradí počítanou hodnotou.

Pokud se stejný název vazby použije vícekrát, základní výpočet se bude opakovat vícekrát. Kdy je to problém?

  • Když výpočty spotřebovávají mnoho prostředků a používají se mnohokrát.
  • Pokud je výpočet ne deterministický, ale dotaz předpokládá, že všechna volání vrátí stejnou hodnotu.

Omezení rizik

Pokud chcete tyto obavy zmírnit, můžete během dotazu materializovat výsledky výpočtu v paměti. V závislosti na způsobu definování pojmenovaného výpočtu použijete různé strategie materializace:

Tabulkové funkce

Pro tabulkové funkce použijte následující strategie:

  • příkazy let a parametry funkce: Použijte funkci materialize().
  • as – operátor: Nastavte hodnotu nápovědy hint.materialized na true.

Například následující dotaz používá ne deterministický tabulkový ukázkový operátor:

Poznámka

Tabulky nejsou obecně seřazené, takže jakýkoli odkaz na tabulku v dotazu je z definice ne deterministický.

Chování bez použití funkce materializace

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

Výstup

x
63
92

Chování pomocí funkce materializace

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

Výstup

x
95
95

Skalární funkce

Neterministické skalární funkce je možné vynutit výpočet přesně jednou pomocí toscalar().

Například následující dotaz používá ne deterministickou funkci rand():

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

Výstup

print_0 print_1 print_2 print_3
166 137 70 70