Kursor (SQL Server)
Berlaku untuk: SQL ServerAzure SQL Database Azure SQL Managed Instance
Operasi dalam database relasional bertindak pada sekumpulan baris lengkap. Misalnya, kumpulan baris yang SELECT
dikembalikan oleh pernyataan terdiri dari semua baris yang memenuhi kondisi dalam WHERE
klausul pernyataan. Kumpulan baris lengkap yang dikembalikan oleh pernyataan ini dikenal sebagai tataan hasil. Aplikasi, terutama aplikasi online interaktif, tidak selalu dapat bekerja secara efektif dengan seluruh hasil yang ditetapkan sebagai unit. Aplikasi ini membutuhkan mekanisme untuk bekerja dengan satu baris atau blok kecil baris pada satu waktu. Kursor adalah ekstensi untuk kumpulan hasil yang menyediakan mekanisme tersebut.
Kursor memperpanjang pemrosesan hasil dengan:
Mengizinkan penempatan pada baris tertentu dari tataan hasil.
Mengambil satu baris atau blok baris dari posisi saat ini dalam tataan hasil.
Mendukung modifikasi data pada baris pada posisi saat ini dalam tataan hasil.
Mendukung berbagai tingkat visibilitas terhadap perubahan yang dibuat oleh pengguna lain ke data database yang disajikan dalam tataan hasil.
Menyediakan pernyataan Transact-SQL dalam skrip, prosedur tersimpan, dan memicu akses ke data dalam kumpulan hasil.
Keterangan
Dalam beberapa skenario, jika ada kunci utama pada tabel, perulangan WHILE
dapat digunakan alih-alih kursor, tanpa menimbulkan overhead kursor.
Namun, ada skenario di mana kursor tidak hanya tidak dapat ditolak, mereka benar-benar diperlukan. Jika demikian, jika tidak ada persyaratan untuk memperbarui tabel berdasarkan kursor, maka gunakan kursor firehose , yang berarti kursor cepat maju dan baca-saja .
Implementasi kursor
SQL Server mendukung tiga implementasi kursor.
Implementasi kursor | Deskripsi |
---|---|
Kursor T-SQL | Kursor Transact-SQL didasarkan pada DECLARE CURSOR sintaks dan digunakan terutama dalam skrip Transact-SQL, prosedur tersimpan, dan pemicu. Kursor Transact-SQL diimplementasikan di server dan dikelola oleh pernyataan Transact-SQL yang dikirim dari klien ke server. Mereka mungkin juga terkandung dalam batch, prosedur tersimpan, atau pemicu. |
Kursor server antarmuka pemrograman aplikasi (API) | Kursor API mendukung fungsi kursor API di OLE DB dan ODBC. Kursor server API diimplementasikan di server. Setiap kali aplikasi klien memanggil fungsi kursor API, penyedia SQL Server Native Client OLE DB atau driver ODBC mengirimkan permintaan ke server untuk tindakan terhadap kursor server API. |
Kursor klien | Kursor klien diimplementasikan secara internal oleh driver ODBC SQL Server Native Client dan oleh DLL yang mengimplementasikan API ADO. Kursor klien diimplementasikan dengan penembolokan semua baris tataan hasil pada klien. Setiap kali aplikasi klien memanggil fungsi kursor API, driver ODBC SQL Server Native Client atau DLL ADO melakukan operasi kursor pada baris kumpulan hasil yang di-cache pada klien. |
Jenis kursor
SQL Server mendukung empat jenis kursor.
Kursor dapat menggunakan tempdb
worktable. Sama seperti operasi agregasi atau pengurutan yang meluap, ini dikenakan biaya I/O, dan merupakan penyempitan performa potensial. STATIC
kursor menggunakan worktable dari awalnya. Untuk informasi selengkapnya, lihat bagian worktables di panduan arsitektur pemrosesan kueri.
Teruskan saja
Kursor khusus penerusan ditentukan sebagai FORWARD_ONLY
dan READ_ONLY
dan tidak mendukung pengguliran. Ini juga disebut kursor firehose dan dukungan hanya mengambil baris secara serial dari awal hingga akhir kursor. Baris tidak diambil dari database hingga diambil. Efek dari semua INSERT
pernyataan , UPDATE
, dan DELETE
yang dibuat oleh pengguna saat ini atau diterapkan oleh pengguna lain yang memengaruhi baris dalam kumpulan hasil terlihat saat baris diambil dari kursor.
Karena kursor tidak dapat digulir mundur, sebagian besar perubahan yang dilakukan pada baris dalam database setelah baris diambil tidak terlihat melalui kursor. Dalam kasus di mana nilai yang digunakan untuk menentukan lokasi baris dalam tataan hasil dimodifikasi, seperti memperbarui kolom yang dicakup oleh indeks berkluster, nilai yang dimodifikasi terlihat melalui kursor.
Meskipun model kursor API database menganggap kursor forward-only sebagai jenis kursor yang berbeda, SQL Server tidak. SQL Server mempertimbangkan hanya maju dan menggulir sebagai opsi yang dapat diterapkan ke kursor statis, berbasis set kunci, dan dinamis. Kursor Transact-SQL mendukung kursor statis, berbasis keyset, dan dinamis khusus ke depan. Model kursor API database mengasumsikan bahwa kursor statis, berbasis keyset, dan dinamis selalu dapat digulir. Saat atribut atau properti kursor API database diatur ke forward-only, SQL Server mengimplementasikan ini sebagai kursor dinamis khusus penerusan.
Statis
Kumpulan hasil lengkap kursor statis dibangun saat tempdb
kursor dibuka. Kursor statis selalu menampilkan tataan hasil seperti saat kursor dibuka. Kursor statis mendeteksi beberapa atau tidak ada perubahan, tetapi mengonsumsi sumber daya yang relatif sedikit saat menggulir.
Kursor tidak mencerminkan perubahan apa pun yang dibuat dalam database yang memengaruhi keanggotaan tataan hasil atau perubahan pada nilai dalam kolom baris yang membentuk tataan hasil. Kursor statis tidak menampilkan baris baru yang disisipkan dalam database setelah kursor dibuka, bahkan jika cocok dengan kondisi pencarian pernyataan kursor SELECT
. Jika baris yang membentuk kumpulan hasil diperbarui oleh pengguna lain, nilai data baru tidak ditampilkan di kursor statis. Kursor statis menampilkan baris yang dihapus dari database setelah kursor dibuka. Tidak ada UPDATE
operasi , INSERT
, atau DELETE
yang tercermin dalam kursor statis (kecuali kursor ditutup dan dibuka kembali), bahkan tidak modifikasi yang dilakukan menggunakan koneksi yang sama yang membuka kursor.
Catatan
Kursor statis SQL Server selalu baca-saja.
Karena kumpulan hasil kursor statis disimpan dalam worktable di tempdb
, ukuran baris dalam tataan hasil tidak boleh melebihi ukuran baris maksimum untuk tabel SQL Server.
Untuk informasi selengkapnya, lihat bagian worktables di panduan arsitektur pemrosesan kueri. Untuk informasi selengkapnya tentang ukuran baris maks, lihat Spesifikasi kapasitas maksimum untuk SQL Server.
Transact-SQL menggunakan istilah tidak sensitif untuk kursor statis. Beberapa API database mengidentifikasinya sebagai kursor rekam jepret.
Set kunci
Keanggotaan dan urutan baris dalam kursor berbasis keyset diperbaiki saat kursor dibuka. Kursor berbasis set kunci dikontrol oleh sekumpulan pengidentifikasi unik, atau kunci, yang dikenal sebagai set kunci. Kunci dibangun dari sekumpulan kolom yang secara unik mengidentifikasi baris dalam tataan hasil. Set kunci adalah kumpulan nilai kunci dari semua baris yang memenuhi syarat untuk SELECT
pernyataan pada saat kursor dibuka. Set kunci untuk kursor berbasis keyset dibangun saat tempdb
kursor dibuka.
Dinamis
Kursor dinamis adalah kebalikan dari kursor statis. Kursor dinamis mencerminkan semua perubahan yang dibuat pada baris dalam tataan hasilnya saat menggulir kursor. Nilai data, urutan, dan keanggotaan baris dalam kumpulan hasil dapat berubah pada setiap pengambilan. Semua UPDATE
pernyataan , INSERT
, dan DELETE
yang dibuat oleh semua pengguna terlihat melalui kursor. Pembaruan akan segera terlihat jika dibuat melalui kursor menggunakan fungsi API seperti SQLSetPos
atau klausa Transact-SQL WHERE CURRENT OF
. Pembaruan yang dibuat di luar kursor tidak terlihat sampai dilakukan, kecuali tingkat isolasi transaksi kursor diatur untuk membaca yang tidak dikomit. Untuk informasi selengkapnya tentang tingkat isolasi, lihat MENGATUR TINGKAT ISOLASI TRANSAKSI (Transact-SQL).
Catatan
Rencana kursor dinamis tidak pernah menggunakan indeks spasial.
Meminta kursor
SQL Server mendukung dua metode untuk meminta kursor:
-
Transact-SQL
Bahasa Transact-SQL mendukung sintaks untuk menggunakan kursor yang dimodelkan setelah sintaks kursor ISO.
Fungsi kursor antarmuka pemrograman aplikasi database (API)
SQL Server mendukung fungsionalitas kursor API database ini:
ADO (Objek Data Microsoft ActiveX)
OLE DB
ODBC (Konektivitas Database Terbuka)
Aplikasi tidak boleh mencampur kedua metode ini untuk meminta kursor. Aplikasi yang menggunakan API untuk menentukan perilaku kursor kemudian tidak boleh menjalankan pernyataan Transact-SQL DECLARE CURSOR
untuk juga meminta kursor Transact-SQL. Aplikasi hanya boleh dijalankan DECLARE CURSOR
jika mengatur semua atribut kursor API kembali ke defaultnya.
Jika kursor Transact-SQL atau API tidak diminta, SQL Server default untuk mengembalikan kumpulan hasil lengkap, yang dikenal sebagai tataan hasil default, ke aplikasi.
Proses kursor
Kursor Transact-SQL dan kursor API memiliki sintaks yang berbeda, tetapi proses umum berikut digunakan dengan semua kursor SQL Server:
Kaitkan kursor dengan kumpulan hasil pernyataan Transact-SQL, dan tentukan karakteristik kursor, seperti apakah baris dalam kursor dapat diperbarui.
Jalankan pernyataan Transact-SQL untuk mengisi kursor.
Ambil baris dalam kursor yang ingin Anda lihat. Operasi untuk mengambil satu baris atau satu blok baris dari kursor disebut ambil. Melakukan serangkaian pengambilan untuk mengambil baris dalam arah maju atau mundur disebut menggulir.
Secara opsional, lakukan operasi modifikasi (perbarui atau hapus) pada baris pada posisi saat ini di kursor.
Tutup kursor.