Mengoptimalkan kueri yang menggunakan ekspresi bernama

Artikel ini membahas cara mengoptimalkan penggunaan ulang ekspresi bernama dalam kueri.

Dalam Bahasa Kueri Kusto, Anda dapat mengikat nama ke ekspresi kompleks dengan beberapa cara berbeda:

Saat Anda mereferensikan ekspresi bernama ini dalam kueri, langkah-langkah berikut ini terjadi:

  1. Perhitungan dalam ekspresi bernama dievaluasi. Perhitungan ini menghasilkan nilai skalar atau tabular.
  2. Ekspresi bernama diganti dengan nilai terhitung.

Jika nama terikat yang sama digunakan beberapa kali, perhitungan yang mendasar akan diulang beberapa kali. Kapan ini menjadi perhatian?

  • Ketika perhitungan mengonsumsi banyak sumber daya dan digunakan berkali-kali.
  • Ketika perhitungan tidak deterministik, tetapi kueri mengasumsikan semua pemanggilan untuk mengembalikan nilai yang sama.

Mitigasi

Untuk mengurangi masalah ini, Anda dapat mewujudkan hasil perhitungan dalam memori selama kueri. Bergantung pada cara penghitungan bernama ditentukan, Anda akan menggunakan strategi materialisasi yang berbeda:

Fungsi bertabel

Gunakan strategi berikut untuk fungsi tabular:

  • let statements and function parameters: Gunakan fungsi materialize( ).
  • sebagai operator: Atur hint.materialized nilai petunjuk ke true.

Misalnya, kueri berikut menggunakan operator sampel tabular non-deterministik:

Catatan

Tabel tidak diurutkan secara umum, sehingga referensi tabel apa pun dalam kueri adalah, menurut definisi, non-deterministik.

Perilaku tanpa menggunakan fungsi materialisasi

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

Output

x
63
92

Perilaku menggunakan fungsi materialisasi

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

Output

x
95
95

Fungsi bernilai skalar

Fungsi skalar non-deterministik dapat dipaksa untuk menghitung tepat sekali dengan menggunakan toscalar().

Misalnya, kueri berikut menggunakan fungsi non-deterministik, 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