Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
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
boolyang menunjukkan apakah nilai kursor databaseingestion_time()rekaman muncul setelah nilai kursor databaserhs.cursor_before_or_at(rhs:string): Fungsi khusus ini dapat digunakan pada rekaman tabel yang mengaktifkan kebijakan IngestionTime. Ini mengembalikan nilai skalar jenis
boolmenunjukkan apakah nilai kursor databaseingestion_time()rekaman datang sebelum atau pada nilai kursor databaserhs.
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
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
Konten terkait
- cursor_current()
-
cursor_before_or_at() -
cursor_after() - kebijakan
IngestionTime