Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Kumpulkan Massal PL/SQL Dengan Klausa LIMIT Di Database Oracle

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!


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana saya bisa mendapatkan akses awal ke pembaruan Oracle Java, sehingga saya dapat menguji RIA saya dan menghindari latihan kebakaran saat pembaruan ini dipublikasikan?

  2. Bagaimana cara Membungkus Kode SQL PL di Oracle?

  3. SQL bukan fungsi grup grup tunggal

  4. Oracle SQL Query untuk mendaftar semua Skema dalam DB

  5. Pengenalan Fungsi PL/SQL Dalam Database Oracle