Kursor database

Beralih layanan menggunakan menu tarik-turun Versi. Pelajari selengkapnya tentang navigasi.
Berlaku untuk: ✅ Azure Data Explorer

Kursor database adalah objek tingkat database yang memungkinkan Anda mengkueri database beberapa kali. Anda mendapatkan hasil yang konsisten bahkan jika ada operasi data-append atau data-retention yang terjadi secara paralel dengan kueri.

Kursor database dirancang untuk mengatasi dua skenario penting:

  • Kemampuan untuk mengulangi kueri yang sama beberapa kali dan mendapatkan hasil yang sama, selama kueri menunjukkan "himpunan data yang sama".

  • Kemampuan untuk membuat kueri "persis sekali". Kueri ini hanya "melihat" data yang tidak dilihat kueri sebelumnya, karena data tidak tersedia saat itu. Kueri memungkinkan Anda melakukan iterasi, misalnya, melalui semua data yang baru tiba dalam tabel tanpa takut memproses rekaman yang sama dua kali atau melewatkan rekaman secara tidak sengaja.

Kursor database diwakili dalam bahasa kueri sebagai nilai skalar jenis string. Nilai aktual harus dianggap buram dan tidak ada dukungan untuk operasi apa pun selain menyimpan nilainya atau menggunakan fungsi kursor berikut.

Fungsi kursor

Kusto menyediakan tiga fungsi untuk membantu menerapkan dua skenario di atas:

  • cursor_current(): Gunakan fungsi ini untuk mengambil nilai kursor database saat ini. Anda dapat menggunakan nilai ini sebagai argumen ke dua fungsi lainnya.

  • cursor_after(rhs:string): Fungsi khusus ini dapat digunakan pada rekaman tabel yang mengaktifkan kebijakan IngestionTime. Ini mengembalikan nilai skalar jenis bool yang menunjukkan apakah nilai kursor database ingestion_time() rekaman muncul setelah nilai kursor database rhs.

  • cursor_before_or_at(rhs:string): Fungsi khusus ini dapat digunakan pada rekaman tabel yang mengaktifkan kebijakan IngestionTime. Ini mengembalikan nilai skalar jenis bool menunjukkan apakah nilai kursor database ingestion_time() rekaman datang sebelum atau pada nilai kursor database rhs.

Dua fungsi khusus (cursor_after dan cursor_before_or_at) juga memiliki efek samping: Saat digunakan, Kusto memancarkan nilai kursor database saat ini ke kumpulan hasil kueri @ExtendedProperties. Nama properti untuk kursor Cursor, dan nilainya adalah satu string.

Misalnya:

{"Cursor" : "636040929866477946"}

Restriksi

Kursor database hanya dapat digunakan dengan tabel yang kebijakan IngestionTime diaktifkan. Setiap rekaman dalam tabel seperti itu dikaitkan dengan nilai kursor database yang berlaku saat rekaman diserap. Dengan demikian, fungsi ingestion_time() dapat digunakan.

Objek kursor database tidak menyimpan nilai yang bermakna kecuali database memiliki setidaknya satu tabel yang memiliki kebijakan IngestionTime ditentukan. Nilai ini dijamin akan diperbarui, sesuai kebutuhan oleh riwayat penyerapan, ke dalam tabel tersebut dan kueri berjalan, yang mereferensikan tabel tersebut. Mungkin, atau mungkin tidak, diperbarui dalam kasus lain.

Proses penyerapan terlebih dahulu menerapkan data, sehingga tersedia untuk kueri, lalu menetapkan nilai kursor aktual untuk setiap rekaman. Mengkueri data segera setelah penyerapan menggunakan kursor database mungkin tidak menggabungkan rekaman terakhir yang ditambahkan karena nilai kursor belum ditetapkan. Selain itu, mengambil nilai kursor database saat ini berulang kali mungkin mengembalikan nilai yang sama, bahkan jika penyerapan dilakukan di antaranya, karena hanya penerapan kursor yang dapat memperbarui nilainya.

Mengkueri tabel berdasarkan kursor database hanya dijamin untuk "bekerja" (memberikan jaminan sekali persis) jika rekaman diserap langsung ke dalam tabel tersebut. Jika Anda menggunakan perintah ekstensi, seperti .move extents atau .replace extents untuk memindahkan data ke dalam tabel, atau jika Anda menggunakan tabel .rename, maka mengkueri tabel ini menggunakan kursor database tidak dijamin untuk menghindari kehilangan data apa pun. Ini karena waktu penyerapan rekaman ditetapkan saat awalnya diserap, dan tidak berubah selama operasi pemindahan.

Ketika tingkat dipindahkan ke tabel target, nilai kursor yang ditetapkan mungkin sudah diproses, dan kueri berikutnya oleh kursor database akan melewatkan rekaman baru.

Contoh:

T dia mengikuti contoh menunjukkan cara memproses rekaman tepat sekali.

Untuk tabel Employees dengan skema [Name, Salary], untuk terus memproses rekaman baru saat diserap ke dalam tabel, gunakan proses berikut:

// [Once] Enable the IngestionTime policy on table Employees
.set table Employees policy ingestiontime true

// [Once] Get all the data that the Employees table currently holds 
Employees | where cursor_after('')

// The query above will return the database cursor value in
// the @ExtendedProperties result set. Lets assume that it returns
// the value '636040929866477946'

// [Many] Get all the data that was added to the Employees table
// since the previous query was run using the previously-returned
// database cursor 
Employees | where cursor_after('636040929866477946') // -> 636040929866477950

Employees | where cursor_after('636040929866477950') // -> 636040929866479999

Employees | where cursor_after('636040929866479999') // -> 636040939866479000