2008-09-17 6 views
5

समस्या को देखते हुए SQL सर्वर 2005 पर संग्रहीत प्रक्रिया, जो एक कर्सर के माध्यम से लूपिंग हो रही है, को एक घंटे में एक बार चलाना चाहिए और इसे चलाने में लगभग 5 मिनट लगते हैं, लेकिन यह प्रोसेसर समय का एक बड़ा हिस्सा लेता है:WAITFOR कमांड

संपादित करें: अगर मैं कर सकता हूं तो मैं कर्सर को हटा दूंगा, दुर्भाग्य से, मुझे प्रोसेसिंग का एक गुच्छा करना होगा और पंक्ति के आधार पर अन्य संग्रहित प्रोसेस/क्वेरी चलाना होगा।

क्या मैं WAITFOR DELAY '0: 0: 0.1' का उपयोग कर सकता हूं प्रत्येक प्रत्येक को .NET के थ्रेड के एसक्यूएल के संस्करण के रूप में कार्य करने से पहले। सो? इस प्रकार अन्य प्रक्रियाओं को इस प्रक्रिया के निष्पादन समय की लागत पर तेज़ी से पूरा करने की इजाजत दी गई है।

या क्या कोई और समाधान है जिसे मैं नहीं देख रहा हूं?

धन्यवाद

उत्तर

4

पाश अंदर WAITFOR लाना वास्तव में यह धीमा और अन्य चीजें तेजी से जाने के लिए अनुमति होगी की जाँच करें। आप एक कर्सर के बजाय WHILE लूप पर भी विचार कर सकते हैं - मेरे अनुभव में यह तेज़ी से चलता है। आप अपने कर्सर को एक तेज़-आगे, केवल-पढ़ने वाले कर्सर पर ले जाने पर भी विचार कर सकते हैं - जो सीमित हो सकता है कि यह कितनी मेमोरी लेता है।

declare @minid int, @maxid int, @somevalue int 
select @minid = 1, @maxid = 5 
while @minid <= @maxid 
begin 
    set @somevalue = null 
    select @somevalue = somefield from sometable where id = @minid 
    print @somevalue 
    set @minid = @minid + 1 
    waitfor delay '00:00:00.1' 
end 
1

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

लेकिन मैं यहां गलत हो सकता हूं, मैं सुझाव दूंगा कि दोनों स्थितियों के तहत सर्वर के प्रदर्शन की जांच करने के लिए परफॉर्म का उपयोग करना है, और फिर निर्णय लें कि यह मूल्यवान है या नहीं, यह प्रतीक्षा करना है या नहीं।

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

0

आप प्रक्रिया में देरी कर सकते हैं, लेकिन यह आपकी मदद नहीं कर सकता है या नहीं। यह इस बात पर निर्भर करता है कि प्रक्रिया कैसे काम करती है। क्या यह एक लेनदेन में है, क्यों एक कर्सर (एसक्यूएल सर्वर में बेहद अक्षम है), मंदी कहाँ है, आदि। शायद प्रक्रिया को फिर से काम करने से अधिक समझदारी होगी।

0

जब से SQL 2005 में विंडोिंग फ़ंक्शन और अन्य साफ-सुथरे विशेषताओं को शामिल किया गया था, तो मैं लगभग सभी मामलों में कर्सर को खत्म करने में सक्षम हूं। शायद कर्सर को खत्म करके आपकी समस्या का सबसे अच्छा प्रदर्शन किया जाएगा?

निश्चित रूप से रैंकिंग कार्यों http://msdn.microsoft.com/en-us/library/ms189798.aspx और सकल खिड़की कार्यों http://msdn.microsoft.com/en-us/library/ms189461.aspx

0

मुझे लगता है कि आपके पास जो भी कोड है, उसका मतलब है कि अन्य प्रक्रियाएं आपके कर्सर से प्राप्त तालिका तक नहीं पहुंच सकती हैं।

बशर्ते कि आप कर्सर को तत्काल फास्टवर्ड बनाएं, आपको कर्सर से प्राप्त टेबल को लॉक नहीं करना चाहिए।

यदि, हालांकि, आपको लिखने की आवश्यकता है, तो WAITFOR मदद नहीं करेगा। एक बार जब आप टेबल लॉक कर लेंगे, तो यह लॉक हो जाएगा।

एक विकल्प तालिका को एक temp तालिका में स्नैपशॉट करना होगा, उसके बाद कर्सर/लूप को इसके बजाय। तब आप अंतर्निहित तालिकाओं को लॉक नहीं करेंगे, लेकिन स्नैपशॉट को संसाधित करते समय तालिकाएं बदल सकती हैं ...

डैम्स