View a markdown version of this page

MENYATAKAN - Amazon Redshift

Amazon Redshift tidak akan lagi mendukung penggunaan Python UDF setelah 30 Juni 2026. Kami akan mulai menegakkannya secara bertahap. Untuk informasi lebih lanjut tentang detail opsi akhir masa pakai dan migrasi Python, lihat posting blog yang diterbitkan pada 30 Juni 2025.

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, kami sarankan menggunakan 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.

Sintaksis

DECLARE cursor_name CURSOR FOR query

Parameter

kursor_nama

Nama kursor baru.

query

Pernyataan SELECT yang mengisi kursor.

Catatan penggunaan DECLARE CURSOR

Jika aplikasi klien Anda menggunakan koneksi ODBC dan kueri Anda membuat kumpulan hasil yang terlalu besar untuk muat dalam memori, Anda dapat melakukan streaming set hasil ke aplikasi klien Anda dengan menggunakan kursor. Ketika Anda menggunakan kursor, seluruh rangkaian hasil diwujudkan pada node pemimpin, dan kemudian klien Anda dapat mengambil hasil secara bertahap.

catatan

Untuk mengaktifkan kursor di ODBC untuk Microsoft Windows, aktifkan Declare/Fetch opsi Gunakan di DSN ODBC yang Anda gunakan untuk Amazon Redshift. Sebaiknya atur ukuran cache ODBC, menggunakan bidang Ukuran Cache di dialog opsi ODBC DSN, menjadi 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, kami sarankan menggunakan 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 membutuhkan set hasil yang lebih besar, Anda dapat mengubah ukuran ke konfigurasi simpul 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 muat dalam memori, itu ditulis ke disk sesuai kebutuhan. Untuk melindungi integritas node pemimpin, Amazon Redshift memberlakukan batasan pada ukuran semua set hasil kursor, berdasarkan jenis node cluster.

Tabel berikut menunjukkan ukuran set hasil total maksimum untuk setiap jenis node cluster. Ukuran set hasil maksimum dalam megabyte.

Tipe simpul Hasil maksimum yang ditetapkan per cluster (MB)

rg.12xlarge beberapa node

7,200.000

rg.4xlarge beberapa node

1.600.000

rg.xlarge beberapa node

240,000

rg.large beberapa node

100,000

ra3.16xlarge beberapa node

14.40000

ra3.4xlarge beberapa node

3,200.000

ra3.xlplus beberapa node

1.000.000

ra3.xlplus simpul tunggal

64,000

ra3.large beberapa node

240,000

ra3.large simpul tunggal

8000

Amazon Redshift Tanpa Server

150.000

dc2.8xlarge beberapa node

3,200.000

dc2.large beberapa node

192.000

dc2.large simpul tunggal

8000

Untuk melihat konfigurasi kursor aktif untuk cluster, kueri tabel STV_KURSOR_KONFIGURASI sistem sebagai superuser. Untuk melihat keadaan kursor aktif, kueri tabel STV_ACTIVE_KURSOR 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 set hasil 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 menggunakan alternatif ini:

  • Gunakan MEMBONGKAR untuk mengekspor tabel 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 fetch JDBC di aplikasi klien Anda. Jika Anda menggunakan koneksi JDBC dan Anda mengalami kesalahan kehabisan memori sisi klien, Anda dapat mengaktifkan klien untuk mengambil kumpulan hasil dalam batch yang lebih kecil dengan menyetel parameter ukuran pengambilan JDBC. Untuk informasi selengkapnya, lihat Mengatur parameter ukuran pengambilan JDBC.

Node RG memiliki ukuran set hasil kursor maksimum yang lebih kecil dibandingkan dengan node RA3 dengan kapasitas komputasi yang serupa. Jika beban kerja kursor mendekati atau melebihi batas untuk jenis node RG Anda, pertimbangkan opsi berikut:

  • Optimalkan ukuran set hasil. Terapkan filter kueri yang lebih selektif, kurangi jumlah kolom yang diambil, atau terapkan paginasi tingkat aplikasi untuk memproses hasil dalam batch yang lebih kecil.

  • Bermigrasi ke tipe node RG yang lebih besar. Jenis node yang lebih besar memberikan kapasitas kursor yang lebih tinggi. Jika jumlah node memungkinkan dan kinerja beban kerja tidak terpengaruh, Anda dapat mengurangi jumlah node secara proporsional untuk mempertahankan total biaya cluster yang sebanding.

Untuk menentukan ukuran kumpulan hasil kursor Anda saat ini, kueri tampilan SYS_QUERY_HISTORY untuk returned_bytes nilai yang terkait dengan pernyataan FETCH pertama yang dieksekusi terhadap kursor. Untuk informasi selengkapnya, lihat SYS_ QUERY_HISTORY.

Contoh DECLARE CURSOR

Contoh berikut mendeklarasikan kursor bernama LOLLAPALOOZA untuk memilih informasi penjualan untuk acara Lollapalooza, dan kemudian mengambil baris dari kumpulan 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 refcursor 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