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:
- Dalam pernyataan let
- Di operator as
- Dalam daftar parameter formal fungsi yang ditentukan pengguna
Saat Anda mereferensikan ekspresi bernama ini dalam kueri, langkah-langkah berikut ini terjadi:
- Perhitungan dalam ekspresi bernama dievaluasi. Perhitungan ini menghasilkan nilai skalar atau tabular.
- 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 ketrue
.
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 |
Konten terkait
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk