दूसरे, क्या मैं ऑर्डर प्राप्त कर सकता हूं यदि मैं ऑर्डर/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 में सभी नंबरों को संग्रहीत नहीं करता है; केवल वर्तमान + अंतिम संख्या) और विचार करें यदि आवश्यक हो तो आदेश दें।