Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.
DECLARE
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, lihatFETCH,CLOSE.
Sintaks
DECLARE cursor_name CURSOR FOR query
Parameter
- nama kursor
-
Nama kursor baru.
- query
-
SELECTPernyataan yang mengisi kursor.
DECLARECURSORcatatan penggunaan
Jika aplikasi klien Anda menggunakan ODBC koneksi 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 Microsoft Windows, aktifkan opsi Gunakan Deklarasi/Ambil di yang Anda gunakan ODBC DSN untuk Amazon Redshift. Kami merekomendasikan pengaturan ukuran ODBC cache, menggunakan bidang Ukuran Cache dalam dialog ODBC DSN opsi, ke 4.000 atau lebih 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 |
DC28XL beberapa node |
3.200.000 |
RA316XL beberapa node |
14.400.000 |
RA34XL beberapa node |
3.200.000 |
RA3XLPLUSbeberapa node |
1.000.000 |
RA3XLPLUSsimpul tunggal |
64.000 |
RA3LARGEbeberapa node |
240.000 |
RA3LARGEsimpul tunggal |
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 ODBC koneksi, kursor mungkin satu-satunya solusi yang layak. Jika memungkinkan, kami sarankan menggunakan alternatif ini:
-
Gunakan UNLOAD untuk mengekspor meja besar. Saat Anda menggunakanUNLOAD, 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.
-
Mengatur parameter ukuran JDBC fetch dalam aplikasi klien Anda. Jika Anda menggunakan JDBC koneksi 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.
DECLARECURSORcontoh
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