Có vẻ như đây là một trong những lĩnh vực mà chức năng PL / SQL đã phát triển qua các bản phát hành khi Oracle triển khai các tối ưu hóa khác nhau.
Lưu ý điều này cũng có nghĩa là một số câu trả lời được liệt kê trong OP cũng được công bố cụ thể ngay cả khi không được đề cập rõ ràng trong các câu hỏi / câu trả lời đó. Khi thời gian trôi qua và việc sử dụng các bản phát hành Oracle cũ hơn (tôi mơ mộng?) Thì thông tin đó sẽ trở nên lỗi thời (có thể mất nhiều thập kỷ để suy nghĩ).
Kết luận trên được hỗ trợ bằng trích dẫn sau đây từ chương 12 Điều chỉnh ứng dụng PL / SQL cho hiệu suất trong tổng số Tham chiếu ngôn ngữ PL / SQL 11g R1 :
Vấn đề này không còn được đề cập trong 11g R2 cũng không phải 12c R1 phiên bản của tài liệu. Điều này phù hợp với sự phát triển của Chương 3 Kiểu dữ liệu PL / SQL.
Trả lời:
Kể từ 11gR2, nó không có gì khác biệt so với sử dụng bộ nhớ quan điểm sử dụng varchar2(10)
hoặc varchar2(32767)
. Trình biên dịch Oracle PL / SQL sẽ xử lý các chi tiết bẩn cho bạn theo cách tối ưu!
Đối với các bản phát hành trước 11gR2, có một điểm giới hạn nơi các chiến lược quản lý bộ nhớ khác nhau được sử dụng và điều này được ghi lại rõ ràng trong PL / SQL Language Reference của mỗi bản phát hành .
Điều trên chỉ áp dụng cho các biến chỉ PL / SQL khi không có giới hạn độ dài tự nhiên có thể được suy ra từ miền vấn đề. Nếu biến varchar2 đại diện cho GTIN-14
thì người ta phải khai báo rằng là varchar2(14)
.
Khi giao diện biến PL / SQL với một cột bảng, hãy sử dụng %type
-t thuộc tính vì đó là cách đơn giản để giữ cho bạn mã PL / SQL và cấu trúc cơ sở dữ liệu đồng bộ.
Kết quả kiểm tra bộ nhớ:
Tôi chạy phân tích bộ nhớ trong Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 với kết quả sau:
str_size iterations UGA PGA
-------- ---------- ----- ------
10 100 65488 0
10 1000 65488 65536
10 10000 65488 655360
32767 100 65488 0
32767 1000 65488 65536
32767 10000 65488 655360
Vì các thay đổi PGA giống hệt nhau và chỉ phụ thuộc vào iterations
chứ không phải str_size
Tôi kết luận rằng kích thước khai báo varchar2 không quan trọng. Mặc dù vậy, bài kiểm tra có thể quá ngây thơ - hoan nghênh các ý kiến!
Tập lệnh thử nghiệm:
-- plsql_memory is a convenience package wrapping sys.v_$mystat s and
-- sys.v_$statname tables written by Steven Feuerstein and available in the
-- code-zip file accompanying his book.
set verify off
define str_size=&1
define iterations=&2
declare
type str_list_t is table of varchar2(&str_size);
begin
plsql_memory.start_analysis;
declare
v_strs str_list_t := str_list_t();
begin
for i in 1 .. &iterations
loop
v_strs.extend;
v_strs(i) := rpad(to_char(i), 10, to_char(i));
end loop;
plsql_memory.show_memory_usage;
end;
end;
/
exit
Ví dụ về chạy thử nghiệm:
$ sqlplus -SL <CONNECT_STR> @memory-test.sql 32767 10000
Change in UGA memory: 65488 (Current = 1927304)
Change in PGA memory: 655360 (Current = 3572704)
PL/SQL procedure successfully completed.
$