Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Thu thập hàng loạt PL / SQL với mệnh đề LIMIT trong Cơ sở dữ liệu Oracle

Thu thập hàng loạt với điều khoản LIMIT trong Cơ sở dữ liệu Oracle

Cho đến nay, chúng tôi đã học cách cải thiện hiệu suất truy vấn bằng cách sử dụng thu thập số lượng lớn với SELECT-INTO sử dụng con trỏ ngầm và câu lệnh FETCH-INTO của một con trỏ rõ ràng. Nhưng câu hỏi vẫn là có còn phạm vi để tối ưu hóa truy vấn hơn nữa không? Trong blog này, chúng ta sẽ tìm hiểu cách chúng ta có thể cải thiện hơn nữa truy vấn của mình bằng cách sử dụng điều khoản Giới hạn với thu thập hàng loạt?

Chúng ta đã tìm hiểu quy trình nén nhiều công tắc bằng cách sử dụng thu thập số lượng lớn với select-in và lần lượt có được quyền kiểm soát tốt hơn đối với truy vấn bằng cách sử dụng tương tự với câu lệnh tìm nạp của một con trỏ rõ ràng. Nhưng vẫn còn một vấn đề cần chúng tôi chú ý và đó là tình trạng cạn kiệt bộ nhớ quá mức do thu thập hàng loạt.

Ý bạn là gì khi cạn kiệt bộ nhớ quá mức do thu thập hàng loạt?

Bất cứ khi nào chúng tôi truy xuất hoặc tìm nạp một số lượng lớn các bản ghi bằng mệnh đề thu thập số lượng lớn, chương trình của chúng tôi bắt đầu tiêu tốn rất nhiều bộ nhớ để nhanh và hiệu quả. Đây không chỉ là bất kỳ ký ức nào. Không giống như bộ nhớ SGA được chia sẻ giữa tất cả các phiên của Cơ sở dữ liệu Oracle, chương trình sử dụng bộ nhớ PGA được phân bổ cụ thể cho mỗi phiên.

Điều này làm giảm hiệu suất của cơ sở dữ liệu. Điều này có nghĩa là truy vấn của chúng tôi chắc chắn phải hoạt động tốt nhưng đồng thời, cơ sở dữ liệu của chúng tôi có thể không.

Chúng tôi không thể có một truy vấn được tối ưu hóa tốt bằng cách ảnh hưởng đến hiệu suất của toàn bộ cơ sở dữ liệu của chúng tôi. Đúng không?

Làm cách nào chúng tôi có thể giải quyết vấn đề cạn kiệt bộ nhớ này bằng cách thu thập hàng loạt?

Vấn đề cạn kiệt bộ nhớ này có thể dễ dàng được khắc phục nếu chúng ta có thể kiểm soát và hạn chế lượng dữ liệu được tìm nạp bằng cách sử dụng thu thập số lượng lớn. Chúng tôi có thể làm điều đó bằng cách sử dụng Thu thập hàng loạt với điều khoản LIMIT.

Cú pháp của mệnh đề LIMIT là gì?

Mệnh đề LIMIT hoạt động như một thuộc tính của câu lệnh FETCH-INTO:

FETCH <cursor_name> BULK COLLECT INTO <plsql_collection> LIMIT number;

Vì LIMIT hoạt động như một thuộc tính của câu lệnh FETCH-INTO nên để sử dụng nó, bạn có thể thêm từ khóa LIMIT theo sau là một chữ số cụ thể sẽ chỉ định số hàng mà mệnh đề thu thập số lượng lớn sẽ truy xuất một lượt ở cuối FETCH -INTO tuyên bố.

Mệnh đề LIMIT làm gì?

Mệnh đề LIMIT hạn chế số lượng hàng được tìm nạp bằng cách sử dụng BULK COLLECT với câu lệnh FETCH.

Chúng ta có thể sử dụng mệnh đề LIMIT với câu lệnh SELECT-INTO không?

Không, chúng ta không thể sử dụng mệnh đề LIMIT với câu lệnh SELECT-INTO. Mệnh đề LIMIT hoạt động như một thuộc tính cho câu lệnh FETCH-INTO vì mệnh đề LIMIT yêu cầu một con trỏ rõ ràng để hoạt động và câu lệnh FETCH-INTO là một phần của vòng đời con trỏ rõ ràng.

Vì vậy, hãy luôn nhớ mệnh đề LIMIT chỉ có thể được sử dụng khi bạn đang sử dụng BULK COLLECT với câu lệnh FETCH-INTO. Nó không thể được sử dụng khi bạn đang sử dụng thu thập hàng loạt với câu lệnh SELECT-INTO.

Ví dụ:Cách sử dụng mệnh đề LIMIT với câu lệnh Bulk Collect trong Cơ sở dữ liệu Oracle

Đây là một ví dụ rất đơn giản cho bạn thấy cách bạn có thể làm việc với mệnh đề 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;
/

Bạn có thể tham khảo video hướng dẫn trên kênh YouTube của tôi để biết giải thích chi tiết về đoạn mã trên.

Vì vậy, lần này thay vì tìm nạp tất cả các bản ghi và sử dụng tài nguyên đắt tiền như bộ nhớ, nhờ mệnh đề LIMIT, chúng tôi chỉ truy xuất các hàng cần thiết và điều đó cũng không gây lãng phí tài nguyên. Bằng cách này, chúng tôi có thể nâng cao hiệu suất truy vấn của mình với thu thập số lượng lớn.

Vì vậy, bây giờ bạn hỏi, Bỏ qua số lượng hàng phù hợp mà chúng tôi có thể tìm nạp là bao nhiêu?

Để biết câu trả lời cho câu hỏi này, tôi khuyên bạn nên đọc blog này của người bạn thân Steven Feuerstein của tôi trên trang web của Oracle. Anh ấy đã trả lời câu hỏi này rất tốt.

Cũng có một thiếu sót với cách tiếp cận này và đó là:Nếu bạn thực hiện lại cùng một chương trình này, thì câu lệnh FETCH-INTO với mệnh đề LIMIT này sẽ không nối bộ sưu tập với 10 bản ghi tiếp theo. Thay vào đó, nó sẽ cắt bớt bảng và điền lại bảng lồng nhau từ chỉ mục số 1.

Người bạn thân yêu của tôi Connor McDonald đã thực hiện một blog giải thích cách bạn có thể khắc phục vấn đề này bằng cách sử dụng MULTISET. Hãy tiếp tục và xem bài viết của anh ấy.

Đó là blog PL / SQL chi tiết về cách sử dụng điều khoản LIMIT với Bulk Collect trong Cơ sở dữ liệu Oracle. Hy vọng bạn thích đọc, nếu vậy hãy nhớ chia sẻ hướng dẫn này với bạn bè của bạn trên phương tiện truyền thông xã hội của bạn. Cảm ơn vì đã đọc. Chúc một ngày tốt lành!


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cách lấy mục lớn thứ hai hoặc lớn thứ ba từ một bảng

  2. Tìm tất cả các giá trị không phải dạng số trong một cột trong Oracle

  3. Oracle:Nếu bảng tồn tại

  4. Oracle ISNULL () Tương đương

  5. Chuyển các giá trị được đọc từ tệp dưới dạng đầu vào cho truy vấn SQL trong Oracle