materialize()
Memungkinkan penembolokan hasil subkueri selama waktu eksekusi kueri dengan cara yang subkueri lain dapat mereferensikan hasil parsial.
Sintaks
materialize(ekspresi)
Argumen
- ekspresi: Ekspresi tabular yang akan dievaluasi dan di-cache selama eksekusi kueri.
Catatan
Materialize memiliki batas ukuran cache 5 GB. Batas ini adalah node per kluster dan saling menguntungkan untuk semua kueri yang berjalan secara bersamaan. Jika kueri menggunakan materialize() dan cache tidak dapat menyimpan data lagi, kueri akan dibatalkan karena kesalahan.
Tip
- Dorong semua operator yang mungkin mengurangi himpunan data materialisasi dan menjaga semantik kueri. Misalnya, menggunakan filter umum di atas ekspresi materialisasi yang sama.
- Menggunakan materialize dengan join atau union ketika operand mereka memiliki subkueri bersama yang dapat dieksekusi sekali. Misalnya, kaki fork join/union. Lihat contoh menggunakan operator join.
- Materialize hanya dapat digunakan dalam pernyataan let jika Anda memberikan nama hasil cache. Lihat contoh penggunaan pernyataan let).
Contoh peningkatan performa kueri
Contoh berikut menunjukkan bagaimana materialize() dapat digunakan untuk meningkatkan kinerja kueri.
Ekspresi _detailed_data didefinisikan menggunakan materialize() fungsi dan oleh karena itu dihitung hanya sekali.
let _detailed_data = materialize(StormEvents | summarize Events=count() by State, EventType);
_detailed_data
| summarize TotalStateEvents=sum(Events) by State
| join (_detailed_data) on State
| extend EventPercentage = Events*100.0 / TotalStateEvents
| project State, EventType, EventPercentage, Events
| top 10 by EventPercentage
| Provinsi | EventType | EventPercentage | Acara |
|---|---|---|---|
| PERAIRAN HAWAII | Puting beliung | 100 | 2 |
| DANAU ONTARIO | Angin Badai Petir Laut | 100 | 8 |
| TELUK ALASKA | Puting beliung | 100 | 4 |
| ATLANTIK UTARA | Angin Badai Petir Laut | 95.2127659574468 | 179 |
| DANAU ERIE | Angin Badai Petir Laut | 92.5925925925926 | 25 |
| E PACIFIC | Puting beliung | 90 | 9 |
| DANAU MICHIGAN | Angin Badai Petir Laut | 85.1648351648352 | 155 |
| DANAU HURON | Angin Badai Petir Laut | 79.3650793650794 | 50 |
| TELUK MEKSIKO | Angin Badai Petir Laut | 71.7504332755633 | 414 |
| HAWAII | Selancar Tinggi | 70.0218818380744 | 320 |
Contoh berikut menghasilkan satu set angka acak dan menghitung:
- berapa banyak nilai yang berbeda dalam set (
Dcount) - tiga nilai teratas dalam set
- jumlah semua nilai ini dalam set
Operasi ini dapat dilakukan dengan menggunakan batch dan materialize:
let randomSet =
materialize(
range x from 1 to 3000000 step 1
| project value = rand(10000000));
randomSet | summarize Dcount=dcount(value);
randomSet | top 3 by value;
randomSet | summarize Sum=sum(value)
Hasil set 1:
| Dcount |
|---|
| 2578351 |
Hasil set 2:
| nilai |
|---|
| 9999998 |
| 9999998 |
| 9999997 |
Hasil set 3:
| Jumlah total |
|---|
| 15002960543563 |
Contoh penggunaan materialize()
Tip
Materialize kolom Anda pada waktu penyerapan jika sebagian besar kueri Anda mengekstrak bidang dari objek dinamis di jutaan baris.
Untuk menggunakan let pernyataan dengan nilai yang Anda gunakan lebih dari sekali, gunakan fungsi materialize(). Cobalah untuk mendorong semua operator yang mungkin yang akan mengurangi himpunan data yang termaterialisasi dan masih menyimpan semantik kueri. Misalnya, menggunakan filter, atau hanya kolom yang diperlukan untuk proyek.
let materializedData = materialize(Table
| where Timestamp > ago(1d));
union (materializedData
| where Text !has "somestring"
| summarize dcount(Resource1)), (materializedData
| where Text !has "somestring"
| summarize dcount(Resource2))
Filter adalah Text saling menguntungkan dan dapat didorong ke ekspresi materialize.
Kueri hanya membutuhkan kolom Timestamp, Text, Resource1, dan Resource2. Proyek kolom-kolom ini di dalam ekspresi materialize.
let materializedData = materialize(Table
| where Timestamp > ago(1d)
| where Text !has "somestring"
| project Timestamp, Resource1, Resource2, Text);
union (materializedData
| summarize dcount(Resource1)), (materializedData
| summarize dcount(Resource2))
Jika filter tidak identik, seperti dalam kueri berikut:
let materializedData = materialize(Table
| where Timestamp > ago(1d));
union (materializedData
| where Text has "String1"
| summarize dcount(Resource1)), (materializedData
| where Text has "String2"
| summarize dcount(Resource2))
Ketika filter gabungan mengurangi hasil materialisasi secara drastis, gabungkan kedua filter pada hasil materialisasi dengan ekspresi logis or seperti pada kueri di bawah ini. Namun, simpan filter di setiap kaki penyatuan pekerja untuk mempertahankan semantik kueri.
let materializedData = materialize(Table
| where Timestamp > ago(1d)
| where Text has "String1" or Text has "String2"
| project Timestamp, Resource1, Resource2, Text);
union (materializedData
| where Text has "String1"
| summarize dcount(Resource1)), (materializedData
| where Text has "String2"
| summarize dcount(Resource2))