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

Oracle अनुक्रम मान का आदेश नहीं दिया गया है

<ब्लॉकक्वॉट>

दूसरे, क्या मैं ऑर्डर प्राप्त कर सकता हूं यदि मैं ऑर्डर/NOORDER के बावजूद अनुक्रम को NOCACHE में बदल देता हूं।

हाँ क्योंकि NOCACHE प्रभावी रूप से ऑर्डर करता है क्योंकि आप प्रत्येक वेतन वृद्धि पर sys.seq$ तालिका में लिखने के लिए मजबूर कर रहे हैं, जिसे नोड्स पर भी क्रमबद्ध करना है।

--

मैं उस संभावित डुप्लिकेट में स्वीकृत उत्तर पर विवाद करूंगा। RAC में CACHE + ORDER और NOCACHE में बहुत बड़ा अंतर है। आप कैश को ऑर्डर के साथ अस्वीकार नहीं कर रहे हैं; बस इसकी प्रभावशीलता को कम करना। मैंने व्यक्तिगत रूप से एक मध्यम स्तरीय एप्लिकेशन के प्रदर्शन को काफी कम होते देखा है क्योंकि उन्होंने अनुक्रम पर NOCACHE का उपयोग किया था और एक साथ कई नोड्स पर पहुंच रहे थे। हमने उनके क्रम को ORDER CACHE में बदल दिया (क्योंकि वे एक क्रॉस-रेस ऑर्डर चाहते थे)। और प्रदर्शन में काफी सुधार हुआ।

संक्षेप में:अनुक्रम की गति "कैच नोर्डर" -> "कैश ऑर्डर" और "नोकैच" के पीछे का रास्ता सबसे तेज से धीमी गति से होगी।

यह आसानी से परीक्षण योग्य भी है:

तो हम एक मानक क्रम से शुरू करते हैं:

SQL> create sequence daz_test start with 1 increment by 1 cache 100 noorder;

Sequence created.

यानी बिना किसी आदेश के कैश। अब हम दो सत्रों में आग लगाते हैं। मैं इस परीक्षण में 4 नोड RAC डेटाबेस 10.2.0.4 का उपयोग कर रहा हूँ:

मेरी टेस्ट स्क्रिप्ट बस है

select instance_number from v$instance;              
set serverout on
declare                                                     
 v_timer   timestamp with time zone := systimestamp;  
 v_num number(22);                                    
begin                                                  
 for idx in 1..100000                                 
 loop                                                 
   select daz_test.nextval into v_num from dual;      
 end loop;                                            
 dbms_output.put_line(systimestamp - v_timer);        
end;                                                   
/ 
/

अब हम पहला परीक्षण चलाते हैं (CACHE NOORDER):

SESSION 1                                       SESSION 2
SQL> @run_test                                  SQL> @run_test

INSTANCE_NUMBER                                 INSTANCE_NUMBER
---------------                                 ---------------
              2                                               1


PL/SQL procedure successfully completed.        PL/SQL procedure successfully completed.


PL/SQL procedure successfully completed.        PL/SQL procedure successfully completed.

SQL> @run_test                                  SQL> @run_test

INSTANCE_NUMBER                                 INSTANCE_NUMBER
---------------                                 ---------------
              2                                               1

+000000000 00:00:07.309916000                   +000000000 00:00:07.966913000

PL/SQL procedure successfully completed.        PL/SQL procedure successfully completed.

+000000000 00:00:08.430094000                   +000000000 00:00:07.341760000

PL/SQL procedure successfully completed.        PL/SQL procedure successfully completed.

तो अनुक्रम के 100,000 पुनरावृत्तियों का चयन करने के लिए 7-8 सेकंड।

अब NOCACHE (ORDER बनाम NOORDER इसके लिए अप्रासंगिक है, क्योंकि हम अनुक्रम के लिए प्रत्येक कॉल के लिए seq$ लिखने के लिए मजबूर कर रहे हैं) आज़माते हैं।

SQL> alter sequence daz_test nocache;

Sequence altered.

SESSION 1                                       SESSION 2
SQL> @run_test                                  SQL> @run_test

INSTANCE_NUMBER                                 INSTANCE_NUMBER
---------------                                 ---------------
              2                                               1

+000000000 00:08:20.040064000                   +000000000 00:08:15.227200000

PL/SQL procedure successfully completed.        PL/SQL procedure successfully completed.

+000000000 00:08:30.140277000                   +000000000 00:08:35.063616000

PL/SQL procedure successfully completed.        PL/SQL procedure successfully completed.

इसलिए हमने समान कार्य सेट के लिए 8 सेकंड से 8 MINUTES की छलांग लगाई है।

कैश + ऑर्डर के बारे में क्या?

SQL> alter sequence daz_test cache 100 order;

Sequence altered.

SQL> @run_test                                  SQL> @run_test

INSTANCE_NUMBER                                 INSTANCE_NUMBER
---------------                                 ---------------
              2                                               1

+000000000 00:00:25.549392000                   +000000000 00:00:26.157107000

PL/SQL procedure successfully completed.        PL/SQL procedure successfully completed.

+000000000 00:00:26.057346000                   +000000000 00:00:25.919005000

PL/SQL procedure successfully completed.        PL/SQL procedure successfully completed.

तो संक्षेप में 100,000 एकल कॉल प्राप्त करने के लिएCACHE NOORDER =8 सेकंडNOCACHE =8 मिनट कैश ऑर्डर =25 सेकंड

कैश ऑर्डर के लिए, ओरेकल आरएसी नोड्स के बीच बहुत अधिक पिंगिंग करता है, लेकिन यह DOESNT कैश आकार का उपयोग होने तक सामान को seq$ पर वापस लिखना होगा, जैसा कि यह सब स्मृति में किया गया है।

अगर मैं आप होते, तो एक उपयुक्त कैश आकार सेट करता (p.s. एक उच्च कैश आकार बॉक्स मेमोरी पर लोड नहीं डालता है, क्योंकि oracle RAM में सभी नंबरों को संग्रहीत नहीं करता है; केवल वर्तमान + अंतिम संख्या) और विचार करें यदि आवश्यक हो तो आदेश दें।




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Mac OS X पर Oracle 11g

  2. Oracle विश्लेषणात्मक कार्य - एक विंडोिंग क्लॉज को रीसेट करना

  3. PL/SQL:त्रुटि PLS-00306:संख्याओं की तालिका के लिए ट्रिगर करने के लिए कॉल में गलत संख्या या तर्क के प्रकार

  4. Oracle:क्या हाल ही में SQL सिंटैक्स त्रुटियाँ प्राप्त करने का कोई तरीका है?

  5. Oracle डेटाबेस में SET DEFINE OFF का उपयोग कब या क्यों करें?