क्या मैं एक संग्रहीत प्रक्रिया लॉन्च कर सकता हूं और तुरंत इसे खत्म होने का इंतजार किए बिना वापस आ सकता हूं?


41

हमारे पास एक संग्रहीत कार्यविधि है जिसे उपयोगकर्ता दिन भर लगातार उपयोग की जाने वाली रिपोर्ट के लिए कुछ अपडेट किए गए नंबरों को प्राप्त करने के लिए मैन्युअल रूप से चला सकते हैं।

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

क्या कोई तरीका है कि एक संग्रहीत प्रक्रिया एक दूसरी संग्रहीत प्रक्रिया शुरू करे, और परिणाम की प्रतीक्षा किए बिना तुरंत वापस लौटे?

मैं SQL Server 2005 का उपयोग कर रहा हूँ।


संग्रहीत प्रक्रियाओं को कैसे कहा जा रहा है? ASP.NET वेब अनुप्रयोग? SSRS?
Mr.Brownstone


@ Mr.Brownstone यह आमतौर पर ASP.Net वेब एप्लिकेशन से कॉल किया जाता है, हालांकि यह उनमें से एक से अधिक द्वारा कॉल किया जा सकता है। मुझे डबल-चेक करना होगा। यह कभी-कभी SSRS से मैन्युअल रूप से चलाया जाता है।
राहेल

@MartinSmith मैंने अतीत में SQL सर्विस ब्रोकर के साथ एक बार काम किया है, और उम्मीद कर रहा था कि एक सरल तरीका होगा। यह कुछ के लिए इस तरह के एक जटिल सेटअप की तरह लगता है जैसे यह सरल है।
राहेल

1
@MartinSmith जो बहुत कुछ है जो मैं सोच रहा था - एसएसआरएस नं के लिए भी, जैसा कि आप नहीं कर सकते, लेकिन जो आप कर सकते थे, उसने रिपोर्ट व्यूअर को एप्लिकेशन में शामिल कर लिया और अपने rdl को उसमें स्थानांतरित कर दिया - इस तरह से यह async कॉल करना संभव होगा रिपोर्ट के लिए भी।
मिस्टरब्रोनस्टोन

जवाबों:


27

ऐसा लगता है कि इसे पूरा करने के कई तरीके हैं, लेकिन मैंने सबसे आसान तरीका यह पाया कि मार्टिन ने एसक्यूएल नौकरी में प्रक्रिया स्थापित करने का मार्टिन का सुझाव दिया था , और अपनी संग्रहीत प्रक्रिया से एसिंक्रोनस sp_start_job कमांड का उपयोग करके इसे शुरू किया ।

EXEC msdb.dbo.sp_start_job @job_name='Run2ndStoredProcedure'

यह केवल मेरे लिए काम करता है क्योंकि मुझे अपनी संग्रहीत प्रक्रिया के लिए कोई पैरामीटर निर्दिष्ट करने की आवश्यकता नहीं है।

अन्य सुझाव जो आपकी स्थिति पर निर्भर करते हुए काम कर सकते हैं

  • मार्टिन और सेबस्टियन जैसे एसक्यूएल सर्विस ब्रोकर का उपयोग करना सुझाव देते हैं। यह शायद सबसे अच्छा सुझाव है यदि आप इसे स्थापित करने और यह कैसे काम करते हैं, यह सीखने की जटिलता को बुरा नहीं मानते।
  • कोड में असिंक्रोनस तरीके से प्रक्रिया को चलाना जो संग्रहीत कार्यविधि को निष्पादित करने के लिए जिम्मेदार है, जैसे Mr.Brownstone ने सुझाव दिया है

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

  • पहली प्रक्रिया को एक ध्वज सेट करें, और उस झंडे की जांच करने के लिए आवर्ती नौकरी को सेट करें और यदि उसका सेट, जैसे कि जिम्बो ने सुझाव दिया हो तो चलाएं । मैं उन नौकरियों का बहुत बड़ा प्रशंसक नहीं हूं जो लगातार चलते हैं और हर कुछ मिनटों में बदलाव की जांच करते हैं, लेकिन यह निश्चित रूप से आपकी स्थिति के आधार पर विचार करने लायक विकल्प है।

3
सर्विस ब्रोकर का उपयोग करके तैयार-से-उपयोग के उदाहरण के लिए अतुल्यकालिक प्रक्रिया निष्पादन पर एक नज़र डालें । Sp_job पर लाभ यह है कि यह एक्सप्रेस संस्करण पर काम करता है और पूरी तरह से डीबी निहित है (एमएसडीबी नौकरी तालिकाओं पर कोई निर्भरता नहीं है)। बाद में डीबीएम विफलता और हा / डीआर वसूली पर बहुत महत्वपूर्ण है।
रेमस रुसानु

गोली मार, मैं देख रहा हूँ मार्टिन एक ही लेख से जुड़ा हुआ है। मैं विफलता / डीआर तर्कों के लिए टिप्पणी छोड़ दूंगा।
रेमस रूसु

@RemusRusanu: ठीक है, यह सेवा ब्रोकर के बारे में जानकारी के सर्वोत्तम स्रोतों में से एक है, लेकिन मुझे लगता है कि आप पहले से ही जानते थे;;
मैरिएन

मुझे @Rusanu का लिंक पसंद आया, लेकिन मैं बिना किसी प्रतिक्रिया के कुछ चाहता था (जो मुझे लगता है कि इस समस्या से मेल खाता है)। मैं पर मेरे सरलीकृत संस्करण लिखा abamacus.blogspot.com/2016/05/...
अबैकस

यदि आप SQL एजेंट की नौकरी शुरू करने का प्रयास करते हैं, तो भी यह EXECUTE permission was denied on the object 'sp_start_job', database 'msdb', schema 'dbo'.Azure पर मौजूद The Brok सेवा, या Sql Agent के साथ विफल हो जाएगा । मुझे नहीं पता कि Microsoft, एक-डेढ़ दशक के बाद लोगों से क्यों पूछ रहा है, जोड़ने से इंकार कर दिया EXECUTE ASYNC RematerializeExpensiveCacheTable
इयान बॉयड

8

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


7

यह पुराना प्रश्न अधिक व्यापक उत्तर देने के योग्य है। इनमें से कुछ अन्य उत्तर / टिप्पणियों में यहां उल्लेखित हैं, अन्य ओपी की विशिष्ट स्थिति के लिए काम कर सकते हैं या नहीं भी कर सकते हैं, लेकिन एसक्यूएल से एसिंक्रोनस रूप से संग्रहीत प्रोक्स कॉलिंग की तलाश में दूसरों के लिए काम कर सकते हैं।

बस पूरी तरह से स्पष्ट होने के लिए: TSQL नहीं करता है (खुद से) अतुल्यकालिक रूप से अन्य TSQL संचालन शुरू करने की क्षमता है

इसका मतलब यह नहीं है कि आपके पास अभी भी बहुत सारे विकल्प नहीं हैं:

  • एसक्यूएल एजेंट नौकरियां : कई एसक्यूएल नौकरियां बनाएं, और या तो उन्हें वांछित समय पर चलाने के लिए शेड्यूल करें, या "मास्टर कंट्रोल" संग्रहित खरीद का उपयोग करके उन्हें एसिंक्रोनस रूप से शुरू करें sp_start_job। यदि आपको उनकी प्रगति को प्रोग्रामिक रूप से मॉनिटर करने की आवश्यकता है, तो बस यह सुनिश्चित करें कि प्रत्येक कस्टम JOB_PROGRESS टेबल को अपडेट करें (या आप यह देख सकते हैं कि क्या उन्होंने अभी तक अनजाने फ़ंक्शन का उपयोग करके ग्रेगरी ए। लार्सन द्वारा इस उत्कृष्ट लेखxp_sqlagent_enum_jobs में वर्णित किया गया है)। आपको जितनी अलग-अलग प्रक्रियाएँ चलानी हैं, उतनी ही अलग-अलग नौकरियां बनानी होंगी, भले ही वे अलग-अलग मापदंडों के साथ समान संग्रहित चल रहे हों।
  • SSIS पैकेज : अधिक जटिल अतुल्यकालिक परिदृश्यों के लिए, एक साधारण शाखा कार्य प्रवाह के साथ SSIS पैकेज बनाएं। SSIS उन कार्यों को अलग-अलग स्पिड में लॉन्च करेगा, जो एसक्यूएल समानांतर में निष्पादित करेगा। SQL एजेंट कार्य से SSIS पैकेज को कॉल करें।
  • कस्टम एप्लिकेशन : अपनी भाषा (C #, Powershell, आदि) की भाषा में एक सरल कस्टम ऐप लिखें, जो उस भाषा द्वारा प्रदान किए गए अतुल्यकालिक तरीकों का उपयोग कर रहा हो। प्रत्येक एप्लिकेशन थ्रेड पर SQL संग्रहित खरीदारी को कॉल करें।
  • OLE स्वचालन : SQL में, उपयोग sp_oacreateऔर sp_oamethodएक नई प्रक्रिया शुरू करने के लिए इस आलेख में वर्णित के रूप में एक दूसरे को संग्रहीत संग्रह बुलाते हैं , यह भी ग्रेगरी ए।
  • सेवा ब्रोकर : इस लेख में सेवा ब्रोकर , अतुल्यकालिक निष्पादन का एक अच्छा उदाहरण है
  • सीएलआर समानांतर निष्पादन : सीएलआर आदेशों का उपयोग करें Parallel_AddSqlऔर Parallel_Executeजैसा कि इस लेख में एलन कपलान (SQL2005 + केवल) द्वारा वर्णित है ।
  • अनुसूचित विंडोज कार्य : पूर्णता के लिए सूचीबद्ध, लेकिन मैं इस विकल्प का प्रशंसक नहीं हूं।

यदि यह मैं होता, तो शायद मैं सरल परिदृश्यों में कई SQL एजेंट नौकरियां, और अधिक जटिल परिदृश्यों में एक SSIS पैकेज का उपयोग करता।

आपके मामले में, SQL एजेंट नौकरियों को कॉल करना एक सरल और प्रबंधनीय विकल्प की तरह लगता है।

एक अंतिम टिप्पणी : SQL पहले से ही जब भी यह कर सकता है व्यक्तिगत संचालन को समानांतर करने का प्रयास करता है। इसका मतलब है कि एक दूसरे के बाद एक ही समय में 2 कार्य चलाना कोई गारंटी नहीं है कि यह जल्द ही समाप्त हो जाएगा। यह देखने के लिए सावधानीपूर्वक परीक्षण करें कि क्या यह वास्तव में कुछ भी सुधारता है या नहीं।

हमारे पास एक डेवलपर था जिसने एक ही समय में 8 कार्यों को चलाने के लिए DTS पैकेज बनाया। दुर्भाग्य से, यह केवल एक 4-सीपीयू सर्वर था :)

* डिफ़ॉल्ट सेटिंग्स मान लेना। यह सर्वर की अधिकतम डिग्री के समानांतरवाद या एफिनिटी मास्क को बदलकर या MAXDOP क्वेरी संकेत का उपयोग करके संशोधित किया जा सकता है।


6

हाँ, एक विधि:

  1. जब पहली संग्रहीत प्रक्रिया पूरी हो जाती है, तो यह दूसरी रिकॉर्ड की गई प्रक्रिया को चलाने के लिए आवश्यक सभी जानकारी के साथ एक रिकॉर्ड सम्मिलित करता है
  2. दूसरी संग्रहीत प्रक्रिया एक नौकरी के रूप में चलती है, हर मिनट या आप किस समय तय करते हैं
  3. यह सम्मिलित रिकॉर्ड की जांच करता है, इसकी प्रक्रिया करता है और रिकॉर्ड को पूर्ण के रूप में चिह्नित करता है

यह संग्रहीत कार्यविधि को आपके द्वारा चलाए जा रहे कार्य की संख्या तक सीमित करता है, जो यदि आप कभी भी चाहते हैं कि एक समय में एक ग्राहक द्वारा कॉल किया जाए तो ठीक है - जबकि आपके पास एक ही समय में एक ही प्रक्रिया को कॉल करने वाले कई ग्राहक हो सकते हैं । इसके अलावा, क्लाइंट को कैसे पता चलेगा कि डेटाबेस को बार-बार पोल किए बिना काम पूरा हो गया है, यह पता लगाने के लिए कि क्या कोई झंडा लगाया गया है?
मिस्टरब्रोनस्टोन

1
@ Mr.Brownstone - संभावित रूप से नौकरी एक से अधिक बकाया कार्य को अलग-अलग संग्रहीत प्रक्रिया कॉल द्वारा पंक्तिबद्ध कर सकती है जब यह चलता है। संग्रहीत प्रक्रिया संभवतया sp_start_jobइसे शुरू करने के लिए कॉल कर सकती है या हर मिनट मतदान से बचने के लिए गतिशील रूप से आवश्यकतानुसार नौकरियों का निर्माण कर सकती है लेकिन उस स्थिति के लिए जटिलता का मतलब है कि यह सेवा दलाल की तुलना में कोई सरल नहीं होगा।
मार्टिन स्मिथ

@MartinSmith मेरे पास वास्तव में पहले से ही इस दूसरी संग्रहीत प्रक्रिया के लिए एक नौकरी सेटअप है क्योंकि यह रात को तब तक चलाया जाता था जब तक कि हमें इसके साथ कुछ समस्याएं नहीं मिलीं जब तक कि यह 1 प्रक्रिया की संख्याओं के साथ सही ढंग से समन्वयित न हो। अगर मैं पहली संग्रहीत प्रक्रिया से काम शुरू करता हूं, तो क्या यह एसिंक्रोनस रूप से चलेगा और तुरंत एसपी से वापस आ जाएगा?
राहेल

@ राचेल - हाँ। sp_start_jobतुरंत लौटता है। याद नहीं कर सकते हैं कि यह क्या अनुमतियों की जरूरत है।
मार्टिन स्मिथ

1
यदि आप बड़े सुरक्षा छेद नहीं खोलना चाहते हैं तो किसी अन्य प्रक्रिया / डेटाबेस से नौकरी शुरू करना एक काफी जटिल समस्या है। Erland Sommarskog की विभिन्न तकनीकों पर एक लेख है जिसे आपको संयोजित करने की आवश्यकता है: sommarskog.se/grantperm.html हालाँकि, इसमें कोई पूर्ण समाधान नहीं है।
सेबस्टियन मेन

1

एक और संभावना यह होगी कि ऑडिट टेबल पर लिखने के लिए पहली संग्रहीत प्रक्रिया प्राप्त की जाए जब वह ऑडिट टेबल पर एक ट्रिगर लगा दे जो ऑडिट टेबल के लिखे जाने पर दूसरी संग्रहीत प्रक्रिया को लॉन्च करता है। निरंतर चुनाव की आवश्यकता नहीं है और एक अतिरिक्त SQL सर्वर एजेंट नौकरी की आवश्यकता नहीं है।


3
पहली संग्रहीत कार्यविधि तब तक वापस नहीं आएगी जब तक कि ऑडिट तालिका में सम्मिलित न हो जाए और जब तक ट्रिगर समाप्त नहीं हो जाता तब तक ऐसा नहीं होगा (द्वितीय संग्रहीत कार्यविधि के लिए कॉल सहित)
मार्टिन स्मिथ

1
मैंने पहले से ही एक ट्रिगर का उपयोग करने पर ध्यान दिया, लेकिन ट्रिगर एसिंक्रोनस रूप से INSERTया UPDATEस्टेटमेंट के साथ समान रूप से चलाए जाते हैं , इसलिए मार्टिन सही है कि 1 प्रक्रिया अभी भी इंतजार कर रही है जब तक कि दूसरी प्रक्रिया वापस आने के लिए समाप्त नहीं हो जाती।
राहेल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.