2011-02-07 14 views

Trả lời

0

Nó phụ thuộc vào tỷ lệ bao nhiêu lần bạn gọi dbms_output.put_line so với những gì khác bạn làm trong PL/SQL.

+1

Một yếu tố lớn khác là loại biểu thức được sử dụng để tạo tham số cho nó, ví dụ: 'dbms_output.put_line (my_slow_function())' –

7

Mọi dòng mã bổ sung đều làm giảm hiệu suất của mã. Sau khi tất cả, nó là một hướng dẫn thêm để được thực hiện, mà ít nhất tiêu thụ một số CPU. Vì vậy, có, dbms_output.put_line giảm hiệu suất.

Câu hỏi thực sự là: lợi ích của dòng mã bổ sung này có lớn hơn hiệu suất phạt không? Chỉ có bạn mới có thể trả lời câu hỏi đó.

Trân trọng,
Rob.

2

Tôi sử dụng bảng nhật ký thay vì dbms_output. Đảm bảo thiết lập giao dịch tự động, giống như (sửa đổi cho nhu cầu của bạn tất nhiên):

create or replace package body somePackage as 
... 
procedure ins_log(
i_msg in varchar2, 
i_msg_type in varchar2, 
i_msg_code in number default 0, 
i_msg_context in varchar2 default null 
) IS PRAGMA AUTONOMOUS_TRANSACTION; 

begin 

    insert into myLogTable 
    (
    created_date, 
    msg, 
    msg_type, 
    msg_code, 
    msg_context 
) 
    values 
    (
    sysdate, 
    i_msg, 
    i_msg_type, 
    i_msg_code, 
    i_msg_context 
); 

    commit; 

end ins_log; 
... 

end; 

Đảm bảo bạn tạo bảng nhật ký tất nhiên. Trong mã của bạn, nếu bạn đang làm rất nhiều hoạt động trong một vòng lặp, bạn có thể muốn chỉ đăng nhập một lần cho mỗi hoạt động x num, một cái gì đó như:

create or replace myProcedure as 
    cursor some_cursor is 
    select * from someTable; 

    v_ctr pls_integer := 0; 

begin 

for rec in some_cursor 
loop 
    v_ctr := v_ctr + 1; 

    -- do something interesting 

    if (mod(v_ctr, 1000) = 0) then 
    somePackage.ins_log('Inserted ' || v_ctr || ' records', 
         'Log', 
         i_msg_context=>'myProcedure'); 
    end if; 

end loop; 
commit; 

exception 
    when others then 
    somePackage.ins_log(SQLERRM, 'Err', i_msg_context=>'myProcedure'); 
    rollback; 
    raise; 
end; 

Lưu ý rằng các giao dịch độc lập sẽ đảm bảo rằng stmt đăng nhập của bạn bị chèn , ngay cả khi một lỗi xảy ra và bạn quay trở lại mọi thứ khác (kể từ khi một giao dịch riêng biệt).

Hope this helps ... tốt hơn nhiều so DBMS_OUTPUT;)

+0

Đây thường là một giải pháp tốt, nhưng khi áp phích ban đầu được quan tâm về chi phí, điều này có thể tồi tệ hơn rất nhiều. Các giao dịch tự động mất nhiều thời gian xử lý hơn các lệnh gọi đến 'dbms_output.put_line'. – Allan

+2

Bạn thực sự không muốn một bó dbms_output.put_lines trong mã sản xuất. Điều này đặc biệt đúng với mã đi vào bất kỳ vòng lặp nào;) – tbone

4

Bạn có thể nhìn vào conditional compilation để các DBMS_OUTPUT.PUT_LINE chỉ trong mã pre-phân tích cú pháp nếu các thủ tục được biên soạn với các tùy chọn thích hợp.

Một câu hỏi là, đã gọi DBMS_OUTPUT.ENABLE. Nếu vậy, bất kỳ giá trị nào trong DBMS_OUTPUT.PUT_LINE sẽ được ghi lại trong cấu trúc bộ nhớ của phiên. Nếu bạn tiếp tục đẩy công cụ vào đó và không bao giờ lấy nó ra (có thể là trường hợp với một số kết nối máy chủ ứng dụng), bạn có thể thấy rằng sau một vài ngày bạn có rất nhiều thứ trong bộ nhớ.