2013-08-28 53 views
5

Tôi có yêu cầu sử dụng hàm REPLACE được xây dựng trên biến CLOB như là một phần của quy trình PL/SQL lớn hơn. Tôi đang sử dụng Oracle 11g R2 và chức năng hoạt động OK, ở chỗ nó thay thế theo yêu cầu, nhưng khi quy trình chạy (có khoảng 2,5 triệu bản ghi để xử lý), nó chậm xuống - như:Tại sao sử dụng hàm REPLACE trên CLOB làm tăng CACHE_LOBS ...?

  • 20.000 hồ sơ đầu tiên: ~ 12 phút
  • thứ hai 20.000 hồ sơ: ~ 24 phút
  • thứ ba 20.000 hồ sơ: ~ 37 phút
  • thứ tư 20.000 hồ sơ: ~ 52 phút
  • vv ...

Kiểm tra V $ TEMPORARY_LOBS trong khi hoạt động cho thấy giá trị cho CACHE_LOBS tăng lên với mỗi hàng được xử lý - giả định của tôi là điều này ngụ ý rằng bộ nhớ liên quan đến LOBS (CLOBS trong trường hợp này) không được phát hành khi nó đã được sử dụng ...?

Bước qua mã bằng trình gỡ rối PL/SQL cho thấy giá trị cho CACHE_LOBS tăng thêm 2 cho mỗi cuộc gọi đến hàm REPLACE. Các cuộc gọi hàm nằm dọc theo các dòng:

clobRTFText   CLOB; 
... 
dbms_lob.createtemporary(clobRTFText, TRUE, dbms_lob.call); 
... 
clobRTFText := REPLACE(clobRTFText, '<CR>', '\par '); <== Causes CACHE_LOBS to increase by 2 
... 
dbms_lob.freetemporary(clobRTFText); <== Doesn't seem to cause CACHE_LOBS to decrease 

Giống như dòng thứ ba của mã trên đang tạo thêm biến CLOB khi đang bay. Có phải bởi vì có một loại chuyển đổi loại tiềm ẩn nào xảy ra do hàm REPLACE đang mong đợi một tham số VARCHAR2? Tôi đã thử sử dụng dbms_lob.copy thay vì "clobRTFText: = REPLACE ... etc", nhưng nó thực sự tồi tệ hơn (tức là CACHE_LOBS tăng nhanh hơn). Bất kể lý do gì, lệnh gọi dbms_lob.freetemporary dường như không tạo ra bất kỳ sự khác biệt nào với giá trị của CACHE_LOBS.

Tôi đã đi qua phần PL/SQL Semantics for LOBs của tài liệu Oracle - nó đề cập đến cách biến CLOB và VARCHAR2 có thể được sử dụng trong các hàm dựng sẵn nhưng tôi không thể tìm thấy bất kỳ điều gì về khả năng gây sử dụng bộ nhớ bổ sung.

Có ai có bất kỳ ý tưởng nào tại sao điều này xảy ra hay không (ví dụ: sử dụng REPLACE với CLOB) mà không giải phóng bộ nhớ (giả sử đó thực sự là điều đang xảy ra)?

Cảm ơn

+1

Bạn đã cố gắng không lưu vào bộ nhớ cache? như trong 'dbms_lob.createtemporary (clobRTFText, FALSE, dbms_lob.call); ' –

+2

Tôi không thấy điều tương tự với một vài biến thể lặp lại những gì bạn đã hiển thị; số lượng 'lob_cache' tăng 2 cho' thay thế', nhưng chỉ lần đầu tiên cho phạm vi. Tôi không bao giờ nhìn thấy giá trị trên 3 hoặc 4. Có lẽ tôi đang làm một cái gì đó khác nhau, vì vậy bạn có thể mở rộng về cách thức này đang được gọi và những gì khác nó đang làm gì? Lý tưởng nhất là một phiên bản cắt xuống hoàn chỉnh cho thấy hành vi. –

+1

Bạn có nhiều người định vị không? Từ tài liệu của [DBMS_LOB] (http://docs.oracle.com/cd/E11882_01/appdev.112/e25788/d_lob.htm#i1015757): _A bản sao của LOB tạm thời được tạo nếu người dùng sửa đổi LOB tạm thời trong khi một định vị khác cũng đang trỏ đến nó. Công cụ định vị mà một sửa đổi đã được thực hiện bây giờ trỏ đến một bản sao mới của LOB._ tạm thời – user272735

Trả lời

1

Tại sao điều này theo thủ tục? Có vẻ như một cách tiếp cận khai báo đáp ứng các yêu cầu.

UPDATE clob_table SET clob_column = REPLACE(clob_column, '<CR>', '\par ');

Bạn có thể cung cấp bất cứ điều gì WHERE khoản phù hợp với bạn.