Oracle
 sql >> डेटाबेस >  >> RDS >> Oracle

मुझे अपने सभी PL/SQL-केवल VARCHAR2 32767 बाइट्स क्यों नहीं बनाने चाहिए?

ऐसा लगता है कि यह उन क्षेत्रों में से एक है जहां पीएल/एसक्यूएल कार्यक्षमता रिलीज पर विकसित हुई है जब ओरेकल ने विभिन्न अनुकूलन लागू किए हैं।

ध्यान दें इसका मतलब यह भी है कि ओपी में सूचीबद्ध कुछ उत्तर भी विशिष्ट हैं, यहां तक ​​​​कि उन प्रश्नों/उत्तरों में स्पष्ट रूप से उल्लेख नहीं किया गया है। जब समय बीत जाता है और पुराने Oracle रिलीज़ का उपयोग समाप्त हो जाता है (मुझे दिवास्वप्न?) तो वह जानकारी पुरानी हो जाएगी (इसमें दशकों लग सकते हैं)।

उपरोक्त निष्कर्ष निम्नलिखित उद्धरण अध्याय 12 से प्रदर्शन के लिए PL/SQL अनुप्रयोगों को ट्यून करना PL/SQL भाषा संदर्भ 11g R1 . का :

इस समस्या का अब 11g R2 न ही 12c R1 दस्तावेज़ का संस्करण। यह अध्याय 3 PL/SQL डेटाटाइप के विकास के अनुरूप है।

उत्तर:

11gR2 के बाद से यह मेमोरी उपयोग . से कोई फर्क नहीं पड़ता varchar2(10) . का उपयोग करने के दृष्टिकोण से या varchar2(32767) . Oracle PL/SQL कंपाइलर आपके लिए गंदी जानकारी को इष्टतम तरीके से संभाल लेगा!

11gR2 से पहले रिलीज़ के लिए एक कटऑफ-पॉइंट होता है जहाँ विभिन्न मेमोरी प्रबंधन रणनीतियों का उपयोग किया जाता है और यह प्रत्येक रिलीज़ के PL/SQL भाषा संदर्भ में स्पष्ट रूप से प्रलेखित है। ।

उपरोक्त केवल पीएल/एसक्यूएल-केवल चर पर लागू होता है जब कोई प्राकृतिक लंबाई प्रतिबंध नहीं होता है जिसे समस्या डोमेन से प्राप्त किया जा सकता है। अगर कोई varchar2-चर GTIN-14 को दर्शाता है तो किसी को यह घोषित करना चाहिए कि varchar2(14)

जब पीएल/एसक्यूएल-वेरिएबल टेबल कॉलम के साथ इंटरफेस करता है तो %type . का उपयोग करता है -एट्रिब्यूट क्योंकि यह आपको पीएल/एसक्यूएल-कोड और डेटाबेस संरचना को सिंक में रखने का शून्य-प्रयास तरीका है।

स्मृति परीक्षण के परिणाम:

मैं निम्नलिखित परिणामों के साथ Oracle डेटाबेस 11g एंटरप्राइज़ संस्करण रिलीज़ 11.2.0.0 में स्मृति विश्लेषण चलाता हूँ:

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

क्योंकि पीजीए परिवर्तन समान हैं और केवल iterations . पर निर्भर करते हैं और नहीं str_size मैंने निष्कर्ष निकाला है कि varchar2 घोषित आकार कोई मायने नहीं रखता। हालांकि परीक्षण बहुत भोला हो सकता है - टिप्पणियों का स्वागत है!

परीक्षण स्क्रिप्ट:

-- 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

टेस्ट रन उदाहरण:

$ 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. Oracle के लिए JDBC में क्लाइंट जानकारी सेट करना

  2. Oracle UCP ड्राइवर और टॉमकैट:थ्रेड्स रुकने में विफल

  3. निरंतर समूहीकरण के लिए Oracle SQL

  4. Oracle BI:पिछले सप्ताह के सभी रिकॉर्ड चुनें

  5. EM ग्रिड नियंत्रण को नए नोड्स तक बढ़ाएँ