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

Thủ tục Tràn bộ đệm

Trước hết, bạn thường không sử dụng DBMS_OUTPUT để ghi nhật ký. Nói chung sẽ có ý nghĩa hơn nhiều khi ghi dữ liệu vào bảng nhật ký, đặc biệt nếu quy trình ghi nhật ký của bạn được xác định là một giao dịch tự trị để bạn có thể theo dõi dữ liệu nhật ký trong khi thủ tục đang chạy. DBMS_OUTPUT sẽ chỉ được hiển thị sau khi toàn bộ quy trình đã hoàn tất thực thi, tại thời điểm đó, nó thường hơi vô nghĩa.

Liên quan đến điểm đầu tiên đó, dựa vào DBMS_OUTPUT để cho người gọi biết rằng đã có một số loại ngoại lệ là một thực hành rất kém. Ở mức tối thiểu, bạn muốn nâng cao lại ngoại lệ đã được ném để bạn có được ngăn xếp lỗi nhằm gỡ lỗi sự cố.

Thứ hai, khi bạn bật đầu ra, bạn phải chỉ định kích thước của bộ đệm DBMS_OUTPUT có thể viết thư cho. Có vẻ như bạn đã khai báo bộ đệm là 20.000 byte, đây là giá trị mặc định nếu bạn chỉ

SQL> set serveroutput on;

Bạn có thể thay đổi điều đó bằng cách chỉ định kích thước nhưng kích thước tối đa được giới hạn ở 1.000.000 byte

SQL> set serveroutput on size 1000000;

Nếu bạn có kế hoạch cập nhật 3 tỷ hàng trong khối 1000 hàng, đó sẽ là bộ đệm quá nhỏ. Bạn sẽ tạo ra hơn 60 lần lượng dữ liệu đó với mã hiện tại của mình. Nếu bạn đang sử dụng 10.2 cả trên máy khách và máy chủ, bạn sẽ có thể cấp phát bộ đệm không giới hạn

SQL> set serveroutput on size unlimited;

nhưng đó không phải là một tùy chọn trong các bản phát hành trước đó.

Cuối cùng, bạn có chắc chắn rằng bạn cần sử dụng PL / SQL ngay từ đầu không? Có vẻ như bạn có thể làm điều này hiệu quả hơn bằng cách thực hiện một CẬP NHẬT duy nhất

UPDATE table_
   SET id = floor( seq/ 10000000000000 )
 WHERE id is null;

Đó là mã ít hơn nhiều, dễ đọc hơn nhiều và sẽ hiệu quả hơn so với giải pháp thay thế PL / SQL. Nhược điểm duy nhất là nó yêu cầu không gian bảng UNDO của bạn đủ lớn để chứa UNDO được tạo nhưng việc cập nhật một cột đơn từ NULL thành giá trị số không phải NULL sẽ không tạo ra nhiều UNDO như vậy.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Làm thế nào để kết nối R với Oracle?

  2. Các lựa chọn thay thế cho LIMIT và OFFSET để phân trang trong Oracle

  3. Cập nhật cột dựa trên bản ghi trước đó

  4. Truy vấn sql Oracle cần thay đổi dựa trên múi giờ

  5. SQL:Liên hợp hai bảng không khớp đầy đủ cột