materialize()
Mengambil nilai ekspresi tabular selama durasi eksekusi kueri sehingga dapat direferensikan beberapa kali oleh kueri tanpa perhitungan ulang.
Sintaks
materialize(
ekspresi)
Pelajari selengkapnya tentang konvensi sintaksis.
Parameter
Nama | Jenis | Diperlukan | Deskripsi |
---|---|---|---|
ekspresi | string |
✔️ | Ekspresi tabular yang akan dievaluasi dan di-cache selama eksekusi kueri. |
Keterangan
Fungsi materialize()
ini berguna dalam skenario berikut:
- Untuk mempercepat kueri yang melakukan perhitungan berat yang hasilnya digunakan beberapa kali dalam kueri.
- Untuk mengevaluasi ekspresi tabular hanya sekali dan menggunakannya berkali-kali dalam kueri. Ini biasanya diperlukan jika ekspresi tabular tidak deterministik. Misalnya, jika ekspresi menggunakan
rand()
fungsi ataudcount()
.
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
Cara lain untuk melakukan materialisasi ekspresi tabular adalah dengan menggunakan hint.materialized
bendera operator sebagai operator dan operator partisi. Semuanya berbagi satu cache materialisasi.
Tip
- Dorong semua operator yang mungkin mengurangi himpunan data materialisasi dan pertahankan 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
Output
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 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 terwujud dan tetap 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))
Saat filter gabungan mengurangi hasil materialisasi secara drastis, gabungkan kedua filter pada hasil materialisasi dengan ekspresi logis or
seperti dalam kueri berikut. 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))
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