2008-12-08 12 views
10

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

  • मैं कैसे एसक्यूएल सर्वर को इंगित कर सकते हैं एक प्रक्रिया समानांतर में चलाने की जानी चाहिए कि क्या है या धारावाहिक — अर्थात्: एसिंक्रोनस रूप से या अवरुद्ध करने का शुरू हुआ?
  • समानांतर में उन्हें चलाने का क्या प्रभाव होगा, यह ध्यान में रखते हुए कि मैंने पहले से ही यह निर्धारित कर लिया है कि प्रक्रिया तालिका पहुंच या ताले के लिए प्रतिस्पर्धा नहीं करेगी- केवल कुल डिस्क io और स्मृति। अधिकांश भाग के लिए वे एक ही टेबल का उपयोग नहीं करते हैं।
  • क्या इससे कोई फर्क पड़ता है कि उनमें से कुछ प्रक्रिया समान प्रक्रिया है, बस विभिन्न मानकों के साथ?
  • यदि मैं एक जोड़ी या प्रक्रियाओं को असीमित रूप से शुरू करता हूं, तो क्या SQL सर्वर में एक अच्छी प्रणाली है, फिर उन दोनों को समाप्त करने के लिए प्रतीक्षा करें, या क्या मुझे उनमें से प्रत्येक को ध्वज सेट करना होगा और समय-समय पर ध्वज को जांचना और मतदान करना होगा WAITFOR DELAY का उपयोग कर?

क्षण हम एसक्यूएल सर्वर 2000

एक पक्ष नोट के रूप में पर हों, यह मायने रखती है क्योंकि मुख्य प्रक्रिया बंद जवाब में एक डेटा डंप के पूरा होने से सर्वर में एक से निकाल दिया गया है मेनफ्रेम सिस्टम। मेनफ्रेम डंप हर रात लगभग 2 घंटे लेता है, और हमारे पास इसका कोई नियंत्रण नहीं है। नतीजतन, हम लगातार प्रसंस्करण के समय को कम करने के तरीकों को खोजने की कोशिश कर रहे हैं।

उत्तर

11

मुझे हाल ही में शोध करना पड़ा, इसलिए इस पुराने सवाल को मिला कि यह एक और पूर्ण उत्तर के लिए भीख मांग रहा था। बस पूरी तरह से स्पष्ट होने के लिए: टीएसक्यूएल (स्वयं ही) में अन्य टीएसक्यूएल संचालन को अतुल्यकालिक रूप से लॉन्च करने की क्षमता है।

मतलब यह नहीं है कि आप अभी भी (उनमें से कुछ अन्य उत्तर में वर्णित) विकल्पों में से एक बहुत कुछ नहीं है:

  • कस्टम अनुप्रयोग: की भाषा में एक सरल कस्टम ऐप लिखें अपने विकल्प, अतुल्यकालिक तरीकों का उपयोग कर। प्रत्येक एप्लिकेशन थ्रेड पर SQL संग्रहित प्रो को कॉल करें।
  • एसक्यूएल एजेंट नौकरियां: एकाधिक एसक्यूएल नौकरियां बनाएं, और उन्हें sp_start_job का उपयोग करके अपनी proc से अतुल्यकालिक रूप से शुरू करें। ग्रेगरी ए लार्सन द्वारा this excellent article में वर्णित अनुसार आप यह देखने के लिए जांच सकते हैं कि क्या उन्होंने अभी तक अनियंत्रित फ़ंक्शन xp_sqlagent_enum_jobs का उपयोग नहीं किया है। (या नौकरियां स्वयं अपनी जॉब_PROGRESS तालिका को अद्यतन करती हैं क्योंकि क्रिस सुझाव देता है।) आपको सचमुच प्रत्येक समांतर प्रक्रिया के लिए अलग-अलग नौकरी बनाना होगा, जो आप चलने की उम्मीद करते हैं, भले ही वे अलग-अलग पैरामीटर के साथ एक ही संग्रहित प्रो चला रहे हों।
  • OLE स्वचालन: उपयोग sp_oacreate और sp_oamethod एक नई प्रक्रिया ग्रेगरी ए लार्सन द्वारा this article में वर्णित है, के रूप में भी अन्य संग्रहीत proc बुला शुरू करने के लिए।
  • डीटीएस पैकेज: एक साधारण ब्रांचिंग कार्य प्रवाह के साथ एक डीटीएस या एसएसआईएस पैकेज बनाएं। डीटीएस व्यक्तिगत स्पिड्स में कार्यों को लॉन्च करेगा।
  • सेवा ब्रोकर: आप पर SQL2005 + कर रहे हैं, Service Broker
  • CLR समानांतर निष्पादन का उपयोग कर इस पर गौर: CLR आदेश Parallel_AddSql और Parallel_Execute एलन कापलान द्वारा this article में वर्णित के रूप (SQL2005 + केवल) का प्रयोग करें।
  • अनुसूचित विंडोज कार्य: पूर्णता के लिए सूचीबद्ध, लेकिन मैं इस विकल्प का प्रशंसक नहीं हूं।

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

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

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

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

+1

चीजों के सेवा ब्रोकर पक्ष पर एक अच्छा लिंक। http://rusanu.com/2009/08/05/asynchronous-procedure-execution/ –

3

कुछ SQL सर्वर एजेंट नौकरियां बनाएं जहां प्रत्येक एक विशेष प्रो चलाता है।

फिर अपने मास्टर प्रो के भीतर से नौकरियों को लात मारो।

प्रतीक्षा करने का एकमात्र तरीका यह है कि मैं सोच सकता हूं कि यदि आपके पास एक स्टेटस टेबल है जो प्रत्येक प्रो अपडेट होने पर अपडेट हो जाती है।

फिर भी एक और नौकरी कुल समापन के लिए उस तालिका को मतदान कर सकती है और अंतिम प्रक्रिया को बंद कर सकती है। वैकल्पिक रूप से, आप इस तालिका पर एक ट्रिगर हो सकता है।

स्मृति निहितार्थ अपने पर्यावरण के लिए पूरी तरह से कर रहे हैं ..

अद्यतन: आप कार्य प्रणाली तक पहुंच नहीं है .. तो आप एक ही दृष्टिकोण ले सकता है। बस विंडोज़ कई कार्यों को निष्पादित करें, प्रत्येक एक प्रो के लिए ज़िम्मेदार है। फिर सभी कार्यों को पूरा होने पर कुछ बंद करने के लिए स्थिति तालिका पर एक ट्रिगर का उपयोग करें।

UPDATE2: इसके अलावा, अगर आप नया ऐप्स बनाना होगा करने को तैयार हैं, तो आप तर्क के सभी एक ही exe में घर सकता है ...

+0

ऐसा लगता है कि यह काम कर सकता है, लेकिन नौकरियां बनाना कुछ ऐसा नहीं है जो यहां प्रोत्साहित किया जाता है। यहां तक ​​कि जिस मुख्य प्रक्रिया के बारे में मैं बात कर रहा हूं वह नौकरी नहीं है- यह एक विंडोज़ निर्धारित कार्य से एक अलग कार्यक्रम के माध्यम से चलाया जाता है। –

+0

.exe विचार थोड़ा अधिक आकर्षक है, हालांकि मैं अभी भी जानना चाहता हूं कि एसक्यूएल सर्वर में इसे उचित तरीके से करना संभव है या नहीं। यह होना चाहिए, अगर यह नहीं है। –

2

आप नौकरियों के लिए अपने रातोंरात sprocs बढ़ने की जरूरत है । एसक्यूएल सर्वर जॉब कंट्रोल आपको वह शेड्यूलिंग करने देगा जो आप पूछ रहे हैं।

2

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

नोट: कॉल को समानांतर में चलाने की अनुमति देने के लिए आपको अपनी कनेक्शन ऑब्जेक्ट्स की कई प्रतियां बनाने की आवश्यकता होगी। एक ही कनेक्शन ऑब्जेक्ट का उपयोग करने वाली दो कॉल अभी भी एक-दूसरे को अवरुद्ध कर देंगी भले ही आप स्पष्ट रूप से निर्भरता में न हों।

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