2009-02-23 9 views
23

क्या पीएल/एसक्यूएल में एसिंक्रोनस कॉलिंग की कोई सुविधा है? मान लीजिए कि मैं कोड के ब्लॉक में हूं, एक प्रक्रिया को कई बार कॉल करना चाहूंगा और प्रक्रिया कब और क्या परेशान नहीं होगी?क्या हम पीएल/एसक्यूएल में थ्रेडिंग का उपयोग कर सकते हैं?

BEGIN 
    myProc(1,100); 
    myProc(101,200); 
    myProc(201,300); 
    ... 
    ... 

END; 

ऊपर मामले में, मैं नहीं चाहता कि मेरी कोड को क्रियान्वित (101,200)
धन्यवाद से पहले संसाधित होने के myProc (1,100) के लिए इंतजार करना चाहते हैं।

उत्तर

23

DBMS_SCHEDULER और DBMS_JOB दृष्टिकोण के लिए +1, लेकिन यह भी आप एक अलग दृष्टिकोण का उपयोग किया जाना चाहिए कि क्या विचार करें।

यदि आपके पास एक प्रक्रिया है जो पंक्ति-दर-पंक्ति तरीके से निष्पादित होती है और आपको लगता है कि यह धीमा है, तो संभवतया यह प्रक्रिया कई बार प्रक्रिया को चलाने के लिए नहीं है, लेकिन यह सुनिश्चित करने के लिए कि सेट-आधारित अप्राच का उपयोग किया जाए बजाय। चरम पर आप प्रक्रिया के दीवार घड़ी के समय को कम करने के लिए समानांतर क्वेरी और समांतर डीएमएल का उपयोग भी कर सकते हैं।

मैं इसका उल्लेख केवल इसलिए करता हूं क्योंकि यह एक बहुत ही आम गलती है।

+3

एक बार जब आप समांतर संकेत को आउट-ऑफ-द-लैब देते हैं, तो प्रत्येक टॉम, डिक और हैरी प्रोग्रामर इसे प्रत्येक क्वेरी में डाल देंगे जैसे कि यह पैरामीटर है। घबराहट, घबराहट हो। –

+0

हां, यह एक व्यस्त प्रणाली पर संसाधन हॉग में प्रश्न पूछेगा। डेटा गोदाम की तरह कुछ पर यह ईटीएल कोड या रिपोर्ट के लिए काफी प्रासंगिक है। एक व्यस्त लेनदेन प्रणाली या ऐसी प्रणाली पर परिचालन रिपोर्ट पर बहुत अच्छे कारण के बिना इसका उपयोग करना गंभीर धड़कन के लिए आधार होना चाहिए। – ConcernedOfTunbridgeWells

11

आप डीबीएमएस_SCHEDULER में देखना चाहते हैं।

संपूर्णता के लिए संपादित:

DMBS_SCHEDULER Oracle 10g पर उपलब्ध है। इससे पहले के संस्करणों के लिए, डीबीएमएस_जेओबी लगभग एक ही काम करता है।

अधिक जानकारी के लिए देखें: http://download.oracle.com/docs/cd/B12037_01/server.101/b10739/jobtosched.htm

17

तो जैसे एक DBMS_JOB में यह जमा करें:

declare 
    ln_dummy number; 
begin 
    DBMS_JOB.SUBMIT(ln_dummy, 'begin myProc(1,100); end;'); 
    DBMS_JOB.SUBMIT(ln_dummy, 'begin myProc(101,200); end;'); 
    DBMS_JOB.SUBMIT(ln_dummy, 'begin myProc(201,300); end;'); 
    COMMIT; 
end; 

आप job_queue_processes पैरामीटर नौकरियों पर कार्रवाई करने के धागे अंडे देने के लिए> 0 पर सेट की आवश्यकता होगी। आप user_jobs को देखकर नौकरियों से पूछ सकते हैं।

ध्यान दें कि यह ओरेकल 9i पर लागू होता है, यह सुनिश्चित नहीं है कि 10 जी का समर्थन क्या है। अधिक जानकारी here देखें।

संपादित करें: जोड़ा गया याद COMMIT

+2

जानकारी के लिए, डीबीएमएस_जेओबी को ओबीकल 10 जी में डीबीएमएस_SCHEDULER द्वारा बहिष्कृत किया गया था। कृपया http://download.oracle.com/docs/cd/B12037_01/server.101/b10739/jobtosched.htm –

+0

इसके साथ एक चाल यह है कि नौकरियां वास्तव में चलने से पहले आपको COMMIT करने की आवश्यकता है। मैंने इसे कुछ लोगों द्वारा याद किया है। –

1

यहां एक फ्लैट फ़ाइल में डेटा उतारने के विभिन्न तरीकों का एक स्पष्टीकरण। तरीकों में से एक यह दिखाता है कि चीजों को गति देने के लिए आप पीएल/एसक्यूएल के साथ समानांतर निष्पादन कैसे कर सकते हैं।

http://www.oracle-developer.net/display.php?id=425

5

समानांतर (मल्टी-थ्रेडेड) ऐसा करने का एक और तरीका है PL/SQL यहाँ दिखाया गया है:

http://www.williamrobertson.net/documents/parallel-plsql-launcher.html

dbms_job या dbms_schedular का उपयोग करने का नुकसान यह है कि तुम नहीं वास्तव में नहीं पता है जब आपके कार्य समाप्त हो जाते हैं। मैंने पढ़ा है कि आप परेशान नहीं हैं लेकिन शायद आप भविष्य में अपना मन बदल देंगे।

संपादित करें:

यह लेख http://www.devx.com/dbzone/10MinuteSolution/20902/0/page/1 एक और तरीका है वर्णन करता है। यह dbms_job और dbms_alert का उपयोग करता है। अलर्ट का उपयोग यह संकेत करने के लिए किया जाता है कि नौकरियां पूरी की जाती हैं (कॉलबैक सिग्नल)।

+1

डीबीएमएस_Scheduler के साथ आप आसानी से एक प्रक्रिया में एक शेड्यूलर श्रृंखला निष्पादित करने के लिए कॉल को लपेट सकते हैं जो चेन चरणों को पूरा करने के लिए जांच करेगा, और श्रृंखला की समाप्ति या विफलता पर कॉलिंग प्रक्रिया पर वापस आ जाएगा। –

-1

क्या आपने ओरेकल एडवांस्ड क्यूइंग का उपयोग करने पर विचार किया है?

9

PL/SQL समानांतर प्रसंस्करण के लिए आप निम्न विकल्प हैं:

ये forking और पी एल में सूत्रण आप "अनुकरण" करने देगा/एसक्यूएल। बेशक, इनका उपयोग करके, आप समांतर निष्पादित प्रक्रियाओं के बीच संवाद करने की आवश्यकता महसूस कर सकते हैं। तो बाहर की जाँच करने के लिए:

व्यक्तिगत तौर पर मैं DBMS_Scheduler का उपयोग कर एक समानांतर प्रसंस्करण प्रणाली लागू की है, और DBMS_Pipe इस्तेमाल किया "सूत्र" के बीच संवाद करने के लिए। मैं दोनों के संयोजन से बहुत खुश था, और मेरा मुख्य लक्ष्य (एक विशेष भारी वजन प्रक्रिया के साथ प्रमुख प्रसंस्करण के समय को कम करने के लिए) हासिल किया गया था!

1

askTom द्वारा यहां सूचीबद्ध समांतर पाइपलाइन दृष्टिकोण एक जटिल दृष्टिकोण प्रदान करता है, लेकिन वास्तव में कार्य पूरा होने तक आप वास्तव में रोक देंगे, डीबीएमएस नौकरी तकनीकों के विपरीत। उस ने कहा, आप "एसिंक्रोनस" तकनीक के लिए पूछते हैं, और डीबीएमएस_जेओबी इसके लिए बिल्कुल सही है।

5

आपके पास 11 जी में शुरू होने वाला दूसरा विकल्प है। ओरेकल ने एक पैकेज पेश किया है जो आप करना चाहते हैं, जैसा कि आप करना चाहते हैं, डीबीएमएस_PARALLEL_EXECUTE

उनके अनुसार, "DBMS_PARALLEL_EXECUTE पैकेज उपयोगकर्ता को समानांतर में तालिका डेटा को क्रमशः अद्यतन करने में सक्षम बनाता है"। इसका उपयोग करने का एक अच्छा सारांश है here

असल में, आप एक तरीका परिभाषित करते हैं कि ओरेकल को अपने काम को टुकड़ों में तोड़ने के लिए उपयोग करना चाहिए (आपके मामले में आप कुछ महत्वपूर्ण मूल्य पारित कर रहे हैं), और फिर यह व्यक्तिगत रूप से प्रत्येक टुकड़े शुरू करेंगे। इसका उपयोग करने के लिए निश्चित रूप से एक छोटी योजना और थोड़ा अतिरिक्त कोडिंग शामिल है, लेकिन कुछ भी नहीं जो आपको वैसे भी नहीं कर रहा था।

इस तरह स्वीकृत विधि का उपयोग करने का लाभ यह है कि ओरेकल डेटाबेस दृश्य भी प्रदान करता है जिसका उपयोग प्रत्येक स्वतंत्र धागे की निगरानी के लिए किया जा सकता है।

संबंधित मुद्दे