2011-03-24 18 views
5

एसक्यूएल 2005/2008एसक्यूएल लूपिंग के लिए कर्सर का विकल्प क्या है?

का उपयोग करके मुझे एक आगे कर्सर का उपयोग करना है, लेकिन मैं खराब प्रदर्शन को भुगतना नहीं चाहता हूं। क्या कर्सर का उपयोग किए बिना मैं लूप कर सकता हूं?

+2

यह पूरी तरह से निर्भर करता है कि आप क्या करने की कोशिश कर रहे हैं! शायद हमें एक इशारा दें, इसलिए हम आपको एक उत्तर दे सकते हैं जो आपकी स्थिति को समझ सकेगा? – Oded

+0

यह मेरा नहीं है, मेरा प्रबंधक नहीं चाहता कि मैं कर्सर का उपयोग करूं। आखिरकार मैं लूपिंग के लिए कर्सर को प्रतिस्थापित करना चाहता हूं ..! – goofyui

+3

मैं विशिष्ट कार्य के बारे में बात कर रहा हूं जो आपको लगता है कि आपको कर्सर की आवश्यकता है। समझाओ कि क्या है और एक उपयोगी उत्तर दिया जा सकता है। – Oded

उत्तर

4

आप WHILE लूप कर सकते हैं, हालांकि आपको एक अधिक सेट आधारित ऑपरेशन प्राप्त करना चाहिए क्योंकि एसक्यूएल में कुछ भी है जो प्रदर्शन के मुद्दों के अधीन है।

http://msdn.microsoft.com/en-us/library/ms178642.aspx

+0

जबकि लूपिंग वास्तव में कर्सर का हिस्सा है ???? – goofyui

+0

मुझे लगता है कि @ डस्टिन कह रहा है कि यदि आप सेट-आधारित संचालन का उपयोग करके ऐसा कर सकते हैं, तो लूपिंग पूरी तरह से अनावश्यक हो सकती है। – DaveE

+0

और @ डेव, आप दोनों सही हो सकते हैं। सेट ऑपरेटर द्वारा आप वास्तव में क्या समझाने की कोशिश कर रहे हैं? मुझे यकीन है कि रिकर्सिव प्रश्न यह कर सकते हैं ..! – goofyui

4
+0

नील, धन्यवाद ..! मैं विश्वास करता हूँ की आप सही है। क्या आप नमूना के रूप में कुछ वाक्यविन्यास कृपया कर सकते हैं। – goofyui

+0

लिंक पर उदाहरण हैं: ओ) –

1

यह कहना "कर्सर एसक्यूएल के प्रदर्शन को प्रभावित" सही नहीं है। उनके पास निश्चित रूप से प्रवृत्ति है, लेकिन उनमें से बहुत से लोग इसका उपयोग कैसे करते हैं।

पहला विकल्प समस्या के लिए सेट-आधारित दृष्टिकोण खोजने का प्रयास करना है।

यदि तर्कसंगत रूप से कोई सेट-आधारित दृष्टिकोण नहीं है, और कर्सर के लिए क्वेरी वास्तविक (गैर-टेम्प) टेबल्स को मार रही है, तो स्टेटिक कीवर्ड का उपयोग करें जो SELECT कथन के परिणामों को टेम्प टेम्प में डाल देगा और इसलिए परिणाम के माध्यम से आप क्वेरी के बेस-टेबल लॉक नहीं करेंगे। स्टेटिक का उपयोग करने से आपकी मदद नहीं होगी यदि आपको परिणाम सेट को संसाधित करते समय गायब हो जाने वाले रिकॉर्ड के प्रति संवेदनशील होने की आवश्यकता है, लेकिन यह एक महत्वपूर्ण बात है यदि आप एक टेम्पल टेबल के खिलाफ WHILE लूप में परिवर्तित करने पर विचार कर रहे हैं (क्योंकि इससे परिवर्तनों के बारे में भी पता नहीं चलेगा अंतर्निहित डेटा के लिए)।

+1

http://www.sqlbook.com/SQL/Avoiding-using-SQL-Cursors-20.aspx - मुझे लूप के दौरान कर्सर को बदलने के बारे में एक लेख मिला ..! जैसा कि आपने/@ डेव का उल्लेख किया है। फिर, यहां हम एक टेम्पलेट टेबल बना रहे हैं ..! – goofyui

+0

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

1

आप जो चाहते हैं उसके आधार पर, आप एक टैली टेबल का उपयोग करने में सक्षम हो सकते हैं।

जेफ Moden मिलान टेबल Here

1

आम टेबल भाव एक अच्छा विकल्प हो सकता है के रूप में @Neil सुझाव पर एक उत्कृष्ट लेख है। यहाँ AdventureWorks से एक उदाहरण है:

WITH cte_PO AS 
(
SELECT [LineTotal] 
    ,[ModifiedDate] 
FROM [AdventureWorks].[Purchasing].[PurchaseOrderDetail] 
), 
minmax AS 
(
    SELECT MIN([LineTotal]) as DayMin 
     ,MAX([LineTotal]) as DayMax 
     ,[ModifiedDate] 
    FROM cte_PO 
    GROUP BY [ModifiedDate] 
) 
SELECT * FROM minmax ORDER BY ModifiedDate 

यहाँ यह क्या रिटर्न के शीर्ष कुछ लाइनों है:

DayMin  DayMax  ModifiedDate 
135.36  8847.30 2001-05-24 00:00:00.000 
129.8115 25334.925 2001-06-07 00:00:00.000 
1

एक कर्सर का उपयोग न करें, बल्कि एक सेट के आधार पर समाधान के लिए लग रही है। यदि आपको सेट-आधारित समाधान नहीं मिल रहा है ... फिर भी कर्सर का उपयोग न करें! आप जो हासिल करने की कोशिश कर रहे हैं उसका विवरण पोस्ट करें, कोई आपके लिए सेट-आधारित समाधान ढूंढ पाएगा।

2

मुझे एक आगे कर्सर का उपयोग करना है, लेकिन मैं खराब प्रदर्शन को भुगतना नहीं चाहता हूं। क्या कर्सर का उपयोग किए बिना मैं लूप कर सकता हूं?

यह कर्सर के साथ आप क्या करते हैं इस पर निर्भर करता है।

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

हालांकि, कुछ चीजें हैं SQL Server संचयी मूल्यों की गणना या तिथि सीमाओं में शामिल होने जैसी बस अच्छी नहीं है।

प्रश्नों के इन प्रकार के तेजी से एक CURSOR का उपयोग किया जा सकता है:

लेकिन फिर, यह एक काफी दुर्लभ अपवाद है, और सामान्य रूप से एक सेट के आधार पर जिस तरह से बेहतर प्रदर्शन करती है।

यदि आपने अपनी क्वेरी पोस्ट की है, तो हम शायद इसे अनुकूलित कर सकते हैं और CURSOR से छुटकारा पा सकते हैं।

0

कुछ परिदृश्य हो सकते हैं जहां कोई Tally tables का उपयोग कर सकता है। यह लूप और cusrors का एक अच्छा विकल्प हो सकता है लेकिन याद रखें कि यह हर मामले में लागू नहीं किया जा सकता है। एक अच्छी तरह से समझाया गया मामला here

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