Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.
MENYATAKAN
Mendefinisikan kursor baru. Gunakan kursor untuk mengambil beberapa baris sekaligus dari kumpulan hasil kueri yang lebih besar.
Ketika baris pertama kursor diambil, seluruh set hasil diwujudkan pada node pemimpin, dalam memori atau pada disk, jika diperlukan. Karena potensi dampak kinerja negatif dari penggunaan kursor dengan set hasil yang besar, sebaiknya gunakan pendekatan alternatif bila memungkinkan. Untuk informasi selengkapnya, lihat Pertimbangan kinerja saat menggunakan kursor.
Anda harus mendeklarasikan kursor dalam blok transaksi. Hanya satu kursor pada satu waktu yang dapat dibuka per sesi.
Untuk informasi lebih lanjut, lihatAMBIL,TUTUP.
Sintaks
DECLARE cursor_name CURSOR FOR query
Parameter
- kursor_nama
-
Nama kursor baru.
- query
-
Pernyataan SELECT yang mengisi kursor.
DEKLARASIKAN catatan penggunaan KURSOR
Jika aplikasi klien Anda menggunakan koneksi ODBC dan kueri Anda membuat kumpulan hasil yang terlalu besar untuk dimasukkan ke dalam memori, Anda dapat mengalirkan hasil yang disetel ke aplikasi klien Anda dengan menggunakan kursor. Saat Anda menggunakan kursor, seluruh kumpulan hasil diwujudkan pada node pemimpin, dan kemudian klien Anda dapat mengambil hasilnya secara bertahap.
catatan
Untuk mengaktifkan kursor di ODBC untuk Microsoft Windows, aktifkan opsi Use Declare/Fetch di ODBC DSN yang Anda gunakan untuk Amazon Redshift. Sebaiknya atur ukuran cache ODBC, menggunakan bidang Ukuran Cache di dialog opsi DSN ODBC, menjadi 4.000 atau lebih besar pada cluster multi-node untuk meminimalkan perjalanan pulang pergi. Pada cluster simpul tunggal, atur Ukuran Cache menjadi 1.000.
Karena potensi dampak kinerja negatif dari penggunaan kursor, sebaiknya gunakan pendekatan alternatif bila memungkinkan. Untuk informasi selengkapnya, lihat Pertimbangan kinerja saat menggunakan kursor.
Kursor Amazon Redshift didukung dengan batasan berikut:
-
Hanya satu kursor pada satu waktu yang dapat dibuka per sesi.
-
Kursor harus digunakan dalam transaksi (BEGIN... END).
-
Ukuran set hasil kumulatif maksimum untuk semua kursor dibatasi berdasarkan jenis node cluster. Jika Anda memerlukan set hasil yang lebih besar, Anda dapat mengubah ukuran ke konfigurasi node XL atau 8XL.
Untuk informasi selengkapnya, lihat Kendala kursor.
Kendala kursor
Ketika baris pertama kursor diambil, seluruh set hasil diwujudkan pada node pemimpin. Jika set hasil tidak sesuai dengan memori, itu ditulis ke disk sesuai kebutuhan. Untuk melindungi integritas node pemimpin, Amazon Redshift memberlakukan batasan pada ukuran semua set hasil kursor, berdasarkan tipe node cluster.
Tabel berikut menunjukkan total ukuran set hasil maksimum untuk setiap jenis node cluster. Ukuran set hasil maksimum dalam megabyte.
Jenis simpul | Hasil maksimal set per cluster (MB) |
---|---|
DC2 Large beberapa node |
192.000 |
DC2 Large simpul tunggal |
8.000 |
DC2 8XL beberapa node |
3.200.000 |
RA3 16XL beberapa node |
14.400.000 |
RA3 4XL beberapa node |
3.200.000 |
RA3 XLPLUS beberapa node |
1.000.000 |
RA3 XLPLUS simpul tunggal |
64.000 |
RA3 Banyak node BESAR |
240.000 |
RA3 Node tunggal BESAR |
8.000 |
Amazon Redshift Tanpa Server |
150.000 |
Untuk melihat konfigurasi kursor aktif untuk sebuah cluster, kueri tabel STV_CURSOR_CONFIGURATION sistem sebagai superuser. Untuk melihat status kursor aktif, kueri tabel STV_ACTIVE_CURSORS sistem. Hanya baris untuk kursor pengguna sendiri yang terlihat oleh pengguna, tetapi superuser dapat melihat semua kursor.
Pertimbangan kinerja saat menggunakan kursor
Karena kursor mewujudkan seluruh hasil yang ditetapkan pada node pemimpin sebelum mulai mengembalikan hasil ke klien, menggunakan kursor dengan set hasil yang sangat besar dapat berdampak negatif pada kinerja. Kami sangat menyarankan agar tidak menggunakan kursor dengan set hasil yang sangat besar. Dalam beberapa kasus, seperti ketika aplikasi Anda menggunakan koneksi ODBC, kursor mungkin satu-satunya solusi yang layak. Jika memungkinkan, kami sarankan untuk menggunakan alternatif ini:
-
Gunakan MEMBONGKAR untuk mengekspor meja besar. Saat Anda menggunakan UNLOAD, node komputasi bekerja secara paralel untuk mentransfer data langsung ke file data di Amazon Simple Storage Service. Untuk informasi selengkapnya, lihat Membongkar data di Amazon Redshift.
-
Tetapkan parameter ukuran pengambilan JDBC di aplikasi klien Anda. Jika Anda menggunakan koneksi JDBC dan Anda mengalami out-of-memory kesalahan sisi klien, Anda dapat mengaktifkan klien Anda untuk mengambil set hasil dalam batch yang lebih kecil dengan mengatur parameter ukuran pengambilan JDBC. Untuk informasi selengkapnya, lihat Mengatur JDBC parameter ukuran pengambilan.
DEKLARASIKAN contoh KURSOR
Contoh berikut mendeklarasikan kursor bernama LOLLAPALOOZA untuk memilih informasi penjualan untuk acara Lollapalooza, dan kemudian mengambil baris dari set hasil menggunakan kursor:
-- Begin a transaction
begin;
-- Declare a cursor
declare lollapalooza cursor for
select eventname, starttime, pricepaid/qtysold as costperticket, qtysold
from sales, event
where sales.eventid = event.eventid
and eventname='Lollapalooza';
-- Fetch the first 5 rows in the cursor lollapalooza:
fetch forward 5 from lollapalooza;
eventname | starttime | costperticket | qtysold
--------------+---------------------+---------------+---------
Lollapalooza | 2008-05-01 19:00:00 | 92.00000000 | 3
Lollapalooza | 2008-11-15 15:00:00 | 222.00000000 | 2
Lollapalooza | 2008-04-17 15:00:00 | 239.00000000 | 3
Lollapalooza | 2008-04-17 15:00:00 | 239.00000000 | 4
Lollapalooza | 2008-04-17 15:00:00 | 239.00000000 | 1
(5 rows)
-- Fetch the next row:
fetch next from lollapalooza;
eventname | starttime | costperticket | qtysold
--------------+---------------------+---------------+---------
Lollapalooza | 2008-10-06 14:00:00 | 114.00000000 | 2
-- Close the cursor and end the transaction:
close lollapalooza;
commit;
Contoh berikut mengulang refkursor dengan semua hasil dari tabel:
CREATE TABLE tbl_1 (a int, b int);
INSERT INTO tbl_1 values (1, 2),(3, 4);
CREATE OR REPLACE PROCEDURE sp_cursor_loop() AS $$
DECLARE
target record;
curs1 cursor for select * from tbl_1;
BEGIN
OPEN curs1;
LOOP
fetch curs1 into target;
exit when not found;
RAISE INFO 'a %', target.a;
END LOOP;
CLOSE curs1;
END;
$$ LANGUAGE plpgsql;
CALL sp_cursor_loop();
SELECT message
from svl_stored_proc_messages
where querytxt like 'CALL sp_cursor_loop()%';
message
----------
a 1
a 3