DECLARE - Amazon Redshift

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