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

Tại sao tôi không nên tạo tất cả VARCHAR2 32767 byte chỉ PL / SQL của mình?

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.

$


  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 cách nào để xuất kết quả truy vấn sang csv trong Oracle SQL Developer?

  2. Độ dài câu lệnh tối đa trong Oracle là bao nhiêu

  3. Chèn các hàng (cha và con) theo chương trình

  4. Con trỏ cơ sở dữ liệu có nhận các thay đổi đối với dữ liệu cơ bản không?

  5. Quy trình đăng nhập trong R12.2 và cách khắc phục sự cố cơ bản