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

Ai đã nghĩ ra thuật ngữ nút DIANA và làm thế nào họ tính được 6.000.000 LOC là xấp xỉ 67108864 (2 ** 26) nút DIANA?

Theo tài liệu Oracle ,

PL / SQL dựa trên ngôn ngữ lập trình Ada.PL/SQL sử dụng một biến thể của Ký hiệu thuộc tính trung gian mô tả cho Ada (DIANA), một ngôn ngữ trung gian có cấu trúc cây. .DIANA được sử dụng trong nội bộ trình biên dịch và các công cụ khác.

Tại thời điểm biên dịch, mã nguồn PL / SQL được dịch thành m-code mà máy đọc được. DIANA được sử dụng để biên dịch các thủ tục phụ thuộc; mã m được thực thi đơn giản.

Thật không may, bạn không thể ước tính số lượng nút DIANA từ kích thước được phân tích cú pháp. Hai đơn vị chương trình có cùng kích thước được phân tích cú pháp có thể yêu cầu 1500 và 2000 nút DIANA, vì ví dụ:đơn vị thứ hai chứa các câu lệnh SQL phức tạp hơn.

Hỏi tom nói

Tìm hiểu thêm về calcualtions nút DIANA, hãy đọc cuốn sách này "Ada-Europe '93:Hội nghị quốc tế Ada-Europe lần thứ 12," Ada Sans Frontieres ", Paris, Pháp, 14-18 tháng 6 năm 1993. Kỷ yếu"

Ghi chú hỗ trợ sau đây cũng đề cập đến chủ đề này ...

Article-ID:         <Note:62603.1>
Folder:             PLSQL
Topic:              General Information Articles
Title:              'PLS-123 Program too Large' - Size Limitations on PLSQL 
                    Packages
Document-Type:      BULLETIN
Impact:             MEDIUM
Skill-Level:        NOVICE
Server-Version:     07 to 08
Updated-Date:       13-JUN-2000 17:41:01
References:         

Tổng quan

Bài viết này chứa thông tin về giới hạn kích thước gói PL / SQL. Khi các giới hạn được giải quyết, bạn nhận được lỗi sau:

PLS-123 Program too large

Giới hạn kích thước trên gói PL / SQL

Trong các bản phát hành trước 8.1.3, các chương trình lớn dẫn đến lỗi PLS-123. Điều này xảy ra do các giới hạn thực sự trong trình biên dịch; không phải do lỗi.

Khi biên dịch một đơn vị PL / SQL, trình biên dịch sẽ xây dựng một cây phân tích cú pháp. Kích thước tối đa của đơn vị aPL / SQL được xác định bởi kích thước của cây phân tích cú pháp. Số lượng tối đa các vi khuẩn nốt sần diana trong cây này.

Lên đến 7.3, bạn có thể có 2 * * 14 (16K) nút diana và từ 8.0 đến 8.1.3, 2 * * 15 (32K) nút diana được phép. Với 8.1.3, giới hạn này đã được nới lỏng để giờ đây bạn có thể có các nút diana 2 * * 26 (tức là 64M) trong cây này cho các phần thân gói và loại.

Giới hạn mã nguồn

Mặc dù không có cách nào dễ dàng để dịch các giới hạn về các dòng mã nguồn, nhưng theo quan sát của chúng tôi rằng có khoảng 5 đến 10 nút trên mỗi dòng mã nguồn. Trước 8.1.3, trình biên dịch có thể biên dịch rõ ràng lên đến khoảng 3.000 dòng mã.

Bắt đầu với 8.1.3, giới hạn đã được nới lỏng đối với các phần thân gói và phần thân loại hiện có thể có khoảng lên đến khoảng 6.000.000 dòng mã.

Lưu ý:Giới hạn mới này chỉ áp dụng cho phần thân gói và phần thân kiểu. Ngoài ra, bây giờ bạn có thể bắt đầu đạt đến một số giới hạn trình biên dịch khác trước khi đạt đến giới hạn trình biên dịch cụ thể này.

Về kích thước mã nguồn, giả sử rằng các mã thông báo (số nhận dạng, toán tử, hàm, v.v.), có độ dài trung bình là bốn ký tự. Sau đó, tối đa sẽ là:

   Up to 7.3:         4 * (2 * * 14)=64K
   From 8.0 to 8.1.3: 4 * (2 * * 15)=128K
   With 8.1.3:        4 * (2 * * 25)=256M

Đây là một ước tính sơ bộ. Nếu mã của bạn có nhiều khoảng trắng, số nhận dạng dài, v.v., bạn có thể kết thúc với mã nguồn lớn hơn thế này. Bạn cũng có thể kết thúc với mã nguồn smallerthan điều này nếu các nguồn của bạn sử dụng số nhận dạng rất ngắn, v.v.

Lưu ý rằng đây là trên mỗi đơn vị chương trình, vì vậy các phần thân gói có nhiều khả năng gặp phải lỗi này nhất.

Cách Kiểm tra Kích thước Hiện tại của Gói hàng

Để kiểm tra kích thước của một gói, số có liên quan gần nhất mà bạn có thể sử dụng là PARSED_SIZE trong chế độ xem từ điển dữ liệu USER_OBJECT_SIZE. Giá trị này cung cấp kích thước của inbyte DIANA được lưu trữ trong bảng SYS.IDL_xxx $ và KHÔNG phải là kích thước trong nhóm được chia sẻ.

Kích thước của phần DIANA của mã PL / SQL (được sử dụng trong quá trình biên dịch) trong nhóm chia sẻ lớn hơn RẤT NHIỀU so với trong bảng hệ thống.

Ví dụ:bạn có thể bắt đầu gặp sự cố với giới hạn 64K khi PARSED_SIZE inUSER_OBJECT_SIZE không quá 50K.

Đối với một gói, kích thước hoặc kích thước được phân tích cú pháp của DIANA chỉ có ý nghĩa đối với toàn bộ đối tượng, không riêng biệt đối với đặc điểm kỹ thuật và nội dung.

Nếu bạn chọn kích thước phân tích cú pháp cho một gói, bạn sẽ nhận được kích thước mã nguồn và kích thước riêng biệt cho đặc tả và nội dung, nhưng chỉ có kích thước được phân tích cú pháp có ý nghĩa cho toàn bộ đối tượng mà đầu ra trên dòng cho đặc tả gói. Một 0 là đầu ra cho dòng phân tích cú pháp cho phần thân gói.

Ví dụ sau thể hiện hành vi này:

CREATE OR REPLACE PACKAGE example AS  
  PROCEDURE dummy1;  
END example;  
/  
CREATE OR REPLACE PACKAGE BODY example AS  
  PROCEDURE dummy1 IS  
  BEGIN  
    NULL;  
  END;  
END;  
/  

SQL> start t1.sql;  

Package created.  


Package body created.  

SQL> select parsed_size from user_object_size where name='EXAMPLE';  


PARSED_SIZE  
-----------  
        185  
          0  


SQL> select * from user_object_size where name='EXAMPLE';  

  .....

Oracle lưu trữ cả DIANA và MCODE trong cơ sở dữ liệu. MCODE là mã thực sự chạy, trong khi DIANA cho một đơn vị thư viện cụ thể X chứa thông tin cần thiết để biên dịch các thủ tục sử dụng đơn vị thư viện X.

Sau đây là một số lưu ý:

a) DIANA được biểu diễn trong IDL. Phiên bản tuyến tính của IDL được lưu trữ trên đĩa. Cây phân tích cú pháp chính xác được xây dựng và lưu trữ trong nhóm chia sẻ. Đây là lý do tại sao kích thước củaDIANA trong nhóm chia sẻ thường lớn hơn trên đĩa.

b) DIANA cho các thủ tục được gọi chỉ được yêu cầu trong nhóm chia sẻ chỉ khi bạn tạo các thủ tục. Trong các hệ thống sản xuất, không cần DIANA trong nhóm chia sẻ (mà chỉ cho MCODE).

c) Bắt đầu với bản phát hành 7.2, DIANA cho phần thân gói bị vứt bỏ, không được sử dụng và không được lưu trữ trong cơ sở dữ liệu. Đây là lý do tại sao PARSED_SIZE (tức là kích thước DIANA) của CÁC CƠ QUAN GÓI là 0.

Một gói được lưu trữ trong DIANA trong cơ sở dữ liệu, giống như một thủ tục. Tuy nhiên, một gói có thể được sử dụng để phá vỡ chuỗi phụ thuộc, có thể khiến điều này biến mất. Tôi tin rằng mã ALLproduction (thực) phải nằm trong một gói, không bao giờ nằm ​​trong một quy trình hoặc chức năng độc lập.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Kiểm tra tình trạng Oracle

  2. Kết nối với Oracle hoạt động thông qua ứng dụng bảng điều khiển và không hoạt động thông qua dịch vụ web

  3. Oracle - Làm cách nào để lấy kích thước thực của ROW cụ thể?

  4. Lotus Notes XPages cho thiết kế và Oracle (hoặc RDBMS khác) cho dữ liệu

  5. ORA-02267:loại cột không tương thích với loại cột được tham chiếu