Bagikan melalui


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 atau dcount() .

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))