Kumpulkan Massal Dengan Klausa LIMIT Di Database Oracle
Sejauh ini kita telah mempelajari cara meningkatkan kinerja kueri menggunakan pengumpulan massal dengan SELECT-INTO yang menggunakan kursor implisit dan pernyataan FETCH-INTO dari kursor eksplisit. Tetapi pertanyaannya tetap apakah masih ada ruang untuk pengoptimalan kueri lebih lanjut? Di blog ini, kita akan mempelajari bagaimana cara meningkatkan kueri lebih lanjut menggunakan klausa Batas dengan pengumpulan massal?
Kami telah mempelajari proses mengompresi beberapa sakelar dengan menggunakan pengumpulan massal dengan pilih-ke dan pada gilirannya mendapatkan kontrol yang lebih besar atas kueri dengan menggunakan yang sama dengan pernyataan ambil-ke dari kursor eksplisit. Namun masih ada masalah yang membutuhkan perhatian kita yaitu kelelahan memori yang berlebihan yang disebabkan oleh pengumpulan massal.
Apa yang Anda maksud dengan kelelahan memori yang berlebihan yang disebabkan oleh pengumpulan massal?
Setiap kali kami mengambil atau mengambil sejumlah besar catatan menggunakan klausa pengumpulan massal, program kami mulai menghabiskan banyak memori agar cepat dan efisien. Ini bukan sembarang kenangan. Tidak seperti memori SGA yang digunakan bersama di antara semua sesi Oracle Database, program menggunakan memori PGA yang secara khusus dialokasikan untuk setiap sesi.
Ini menurunkan kinerja database. Ini berarti bahwa kueri kita pasti berkinerja baik tetapi pada saat yang sama, database kita mungkin tidak.
Kami tidak dapat memiliki kueri yang dioptimalkan dengan baik dengan mengorbankan kinerja seluruh basis data kami. Benar?
Bagaimana cara mengatasi masalah kehabisan memori ini dengan mengumpulkan massal?
Masalah kehabisan memori ini dapat dengan mudah diatasi jika kita dapat mengontrol dan membatasi jumlah data yang diambil menggunakan pengumpulan massal. Kita bisa melakukannya dengan menggunakan Bulk Collect dengan klausa LIMIT.
Apa sintaks klausa LIMIT?
Klausa LIMIT berfungsi sebagai atribut dari pernyataan FETCH-INTO:
FETCH <cursor_name> BULK COLLECT INTO <plsql_collection> LIMIT number;
Karena LIMIT berfungsi sebagai atribut dari pernyataan FETCH-INTO sehingga untuk menggunakannya, Anda dapat menambahkan kata kunci LIMIT diikuti dengan digit numerik tertentu yang akan menentukan jumlah baris yang akan diambil oleh klausa pengumpulan massal sekaligus di akhir FETCH -Pernyataan INTO.
Apa yang dilakukan klausa LIMIT?
Klausa LIMIT membatasi jumlah baris yang diambil menggunakan BULK COLLECT dengan pernyataan FETCH.
Dapatkah kita menggunakan klausa LIMIT dengan pernyataan SELECT-INTO?
Tidak, kita tidak dapat menggunakan klausa LIMIT dengan pernyataan SELECT-INTO. Klausa LIMIT berfungsi sebagai atribut untuk pernyataan FETCH-INTO karena klausa LIMIT memerlukan kursor eksplisit untuk bekerja dan pernyataan FETCH-INTO adalah bagian dari siklus hidup kursor eksplisit.
Jadi selalu ingat klausa LIMIT hanya dapat digunakan ketika Anda menggunakan BULK COLLECT dengan pernyataan FETCH-INTO. Itu tidak dapat digunakan saat Anda menggunakan pengumpulan massal dengan pernyataan SELECT-INTO.
Contoh:Cara menggunakan klausa LIMIT dengan pernyataan Bulk Collect di Oracle Database
Berikut adalah contoh yang sangat sederhana yang menunjukkan kepada Anda bagaimana Anda dapat bekerja dengan klausa LIMIT.
SET SERVEROUTPUT ON; DECLARE CURSOR exp_cur IS SELECT first_name FROM employees; TYPE nt_fName IS TABLE OF VARCHAR2(20); fname nt_fName; BEGIN OPEN exp_cur; FETCH exp_cur BULK COLLECT INTO fname LIMIT 10; CLOSE exp_cur; --Print data FOR idx IN 1 .. fname.COUNT LOOP DBMS_OUTPUT.PUT_LINE (idx||' '||fname(idx) ); END LOOP; END; /
Anda dapat merujuk ke video tutorial di saluran YouTube saya untuk penjelasan rinci tentang kode di atas.
Jadi kali ini alih-alih mengambil semua catatan dan menghabiskan sumber daya yang mahal seperti memori, berkat klausa LIMIT, kami hanya mengambil baris yang diperlukan dan itu juga tanpa pemborosan sumber daya. Dengan cara ini, kami dapat meningkatkan kinerja kueri kami dengan pengumpulan massal.
Jadi sekarang Anda bertanya, Manish, berapa jumlah baris yang tepat yang dapat kita ambil?
Untuk mengetahui jawaban atas pertanyaan ini, saya sarankan Anda untuk membaca blog ini oleh sahabat saya Steven Feuerstein di situs web Oracle. Dia telah menjawab pertanyaan ini dengan sangat baik.
Ada kekurangan dengan pendekatan ini juga dan itu adalah:Jika Anda menjalankan program yang sama ini lagi, maka pernyataan FETCH-INTO dengan klausa LIMIT ini tidak akan menambahkan koleksi dengan 10 catatan berikutnya. Sebaliknya, itu akan memotong tabel dan mengisi tabel bersarang lagi dari indeks no.1.
Teman saya Connor McDonald telah membuat blog yang menjelaskan bagaimana Anda dapat mengatasi masalah ini menggunakan MULTISET. Silakan periksa artikelnya.
Itu adalah blog PL/SQL terperinci tentang cara menggunakan klausa LIMIT dengan Bulk Collect di Oracle Database. Semoga Anda menikmati membaca, jika demikian, pastikan untuk membagikan tutorial ini dengan teman-teman Anda di media sosial Anda. Terima kasih sudah membaca. Semoga harimu menyenangkan!