उपयोग पर नॉट सेट करें


341

इस सवाल से प्रेरित होकर SET NOCOUNT पर अलग-अलग विचार हैं ...

क्या हमें SQL सर्वर के लिए SET NOCOUNT ON का उपयोग करना चाहिए? यदि नहीं, तो क्यों नहीं?

22 जुलाई 2011 को यह 6 को संपादित करता है

यह किसी भी डीएमएल के बाद "xx पंक्तियों से प्रभावित" संदेश को दबा देता है। यह एक परिणाम है और जब भेजा जाता है, तो ग्राहक को इसे संसाधित करना होगा। यह छोटा है, लेकिन औसत दर्जे का है (नीचे उत्तर देखें)

ट्रिगर्स आदि के लिए, क्लाइंट को कई "xx पंक्तियाँ प्रभावित" प्राप्त होंगी और यह कुछ ORM, MS Access, JPA आदि के लिए सभी प्रकार की त्रुटियों का कारण बनता है (नीचे संपादन देखें)

पृष्ठभूमि:

सामान्य स्वीकृत सर्वोत्तम अभ्यास (मुझे लगा कि इस प्रश्न तक) SET NOCOUNT ONSQL सर्वर में ट्रिगर और संग्रहीत प्रक्रियाओं में उपयोग करना है। हम इसका हर जगह उपयोग करते हैं और एक त्वरित Google बहुत सारे SQL सर्वर MVP सहमत भी दिखाता है।

MSDN का कहना है कि यह एक .net SQLDataAdapter को तोड़ सकता है ।

अब, मेरे लिए इसका मतलब यह है कि SQLDataAdapter पूरी तरह से केवल CRUD प्रसंस्करण तक सीमित है क्योंकि यह "n पंक्तियाँ प्रभावित" संदेश को मिलान करने की अपेक्षा करता है। इसलिए, मैं उपयोग नहीं कर सकता:

  • यदि डुप्लिकेट से बचने के लिए EXISTS (कोई प्रभावित संदेश नहीं पंक्तियाँ) नोट: सावधानी के साथ उपयोग करें
  • जहां उम्मीद नहीं है (कम पंक्तियाँ तो उम्मीद थी
  • तुच्छ अपडेट फ़िल्टर करें (उदाहरण के लिए कोई डेटा वास्तव में नहीं बदलता है)
  • पहले कोई टेबल एक्सेस करें (जैसे लॉगिंग)
  • जटिलता या निंदा छिपाएँ
  • आदि

प्रश्न में marc_s (जो अपने SQL सामान को जानता है) का कहना है कि इसका उपयोग न करें। यह मेरे विचार से भिन्न है (और मैं खुद को एसक्यूएल में कुछ हद तक सक्षम मानता हूं)।

यह संभव है कि मैं कुछ याद कर रहा हूं (स्पष्ट इंगित करने के लिए स्वतंत्र महसूस करता हूं), लेकिन आप लोग क्या सोचते हैं?

नोट: मुझे इस त्रुटि को देखे हुए कई साल हो चुके हैं क्योंकि मैं आजकल SQLDataAdapter का उपयोग नहीं करता हूं।

टिप्पणियों और प्रश्नों के बाद संपादन:

संपादित करें: अधिक विचार ...

हमारे पास कई ग्राहक हैं: एक C # SQLDataAdaptor का उपयोग कर सकता है, दूसरा जावा से nHibernate का उपयोग कर सकता है। ये अलग-अलग तरीकों से प्रभावित हो सकते हैं SET NOCOUNT ON

यदि आप संग्रहीत procs को विधियों के रूप में मानते हैं, तो यह बुरा स्वरूप (एंटी-पैटर्न) है कि कुछ आंतरिक प्रसंस्करण अपने स्वयं के प्रयोजनों के लिए एक निश्चित तरीका काम करता है।

2 संपादित करें: एक ट्रिगर ब्रेकिंग एनहाइनेट प्रश्न , जहां SET NOCOUNT ONसेट नहीं किया जा सकता है

(और नहीं, यह नहीं का डुप्लिकेट है, इस )

संपादित करें 3: फिर भी अधिक जानकारी, मेरे एमवीपी सहयोगी के लिए धन्यवाद

संपादन 4: 13 मई 2011

निर्दिष्ट नहीं होने पर भी Linq 2 SQL तोड़ता है?

संपादित करें 5: 14 जून 2011

JPA को तोड़ता है, तालिका चर के साथ संग्रहित खरीद: क्या JPA 2.0 SQL सर्वर तालिका चर का समर्थन करता है?

संपादन 6: 15 अगस्त 2011

SSMS "डेटा पंक्तियाँ संपादित करें" डेटा ग्रिड को SET NOCOUNT ON: GROUP BY के साथ अपडेट ट्रिगर की आवश्यकता होती है

संपादन 2013: ० 07 मार्च २०१३

@RemusRusanu से अधिक गहराई से विवरण:
क्या वास्तव में ऐसा प्रदर्शन करने से कोई फर्क पड़ता है


@AlexKuznetsov: "थ्रेडसेफ़" दृष्टिकोण क्या होगा? निश्चित रूप से EXISTS में प्रदर्शन किया गया कोई भी बकाया लेनदेन शामिल है?
एंथनीवजोन

2
@ जेरेमी सेगी: देर से जवाब के लिए क्षमा करें। (# प्रभावित) संदेश एसएसएमएस आदि द्वारा व्याख्या की गई एक क्लाइंट टूल चीज़ है: हालांकि इस जानकारी के साथ एक पैकेट भेजा गया है। बेशक, मुझे पता है कि @@ rowcount कैसे काम करता है आदि, लेकिन यह सवाल का बिंदु नहीं है ...
gbn

1
कोई चिंता नहीं। व्यक्तिगत रूप से मैं आपके दृष्टिकोण से सहमत हूं; मैं सिर्फ टिप्पणी कर रहा था कि एक IF / WHERE EXISTS निर्माण और सेट नोवाइट के परिणामों के बीच कोई सीधा संबंध नहीं है। मुझे उन निर्माणों से लगातार परिणाम प्राप्त होते हैं, भले ही NOCOUNT के बिना। यदि आपके पास कुछ और है, तो कृपया इसे मेरे तरीके से भेजें।
जेरेमी एस

1
@ जेरेमी सेगी: आप सही हैं: सेट पर केवल ग्राहक के डेटा के अतिरिक्त पैकेट को दबाता है। IF, @@ ROWCOUNT आदि सभी अप्रभावित हैं। ओह, और यह SQLDataAdapters तोड़ता है ... :-)
gbn

1
@ किरेन जॉनस्टोन: अधूरेपन में, यह एक खराब शब्द है। अगर यह मेरा सवाल नहीं होता तो मैं बंद कर देता हूँ ...
gbn

जवाबों:


245

ठीक है अब मैंने अपना शोध किया है, यहाँ सौदा है:

टीडीएस प्रोटोकॉल में, प्रति क्वेरीSET NOCOUNT ON केवल 9-बाइट्स बचाता है जबकि पाठ "सेट नोव ऑन" अपने आप में एक 14 बाइट्स है। मुझे लगता है कि 123 row(s) affectedएक अलग नेटवर्क पैकेट में सादे पाठ में सर्वर से वापस आ गया था, लेकिन ऐसा नहीं है। यह वास्तव में एक छोटी संरचना है जिसे DONE_IN_PROCप्रतिक्रिया में एम्बेडेड कहा जाता है । यह एक अलग नेटवर्क पैकेट नहीं है, इसलिए कोई राउंडट्रिप व्यर्थ नहीं जाता है।

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

यहाँ SET NOCOUNTसेटिंग के महत्व के बारे में एक बहुत विस्तृत विश्लेषण है : http://daleburnett.com/2014/01/everything-ever-wanted-know-set-nocount/


वास्तव में। मैं हमेशा के लिए सेट पर उपयोग कर रहा हूँ, लेकिन marc_s ने अन्य प्रश्न में SQLDataAdapter की सीमा को इंगित किया।
gbn

धन्यवाद। बाइट्स या आकार मेरे लिए मुद्दा नहीं है, लेकिन क्लाइंट को इसे प्रोसेस करना है। यह SQLDataAdapter निर्भरता है कि अभी भी मुझे हालांकि astounds ...
gbn

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

13
इसके बाइट की संख्या तार पर उसकी गोल यात्रा में देरी नहीं है जो कि प्रदर्शन हत्यारा है
रेसिंग्सनैल

1
टीडीएस संदेश धारा में, और उदाहरण तब है जब कोई तालिका में केवल मान सम्मिलित कर रहा हो। DONINPROC(RPC) या DONE(BATCH) संदेश rowcountको प्रभावित पंक्तियों के सेट के साथ प्रवाहित किया जाता है , जबकि done_countझंडा है true, भले ही NO_COUNTवह हो ON। मामलों में क्लाइंट के काम पर अमल पर निर्भर करता है जब क्वेरी सेलेक्ट स्टेटमेंट्स या RPC कॉल करता है जो सेलेक्ट करता है, इसे काउंटिंग को डिसेबल करना पड़ सकता है ... जब भी डिसेबल किया जाता है, तो पंक्तियों को सिलेक्ट स्टेटमेंट के लिए काउंट किया जाता है, लेकिन फ्लैग DONE_COUNTको सेट कर दिया जाता है false। हमेशा पढ़ें कि आपके क्लाइंट की क्या सलाह है क्योंकि यह आपके बजाय टोकन (संदेश) स्ट्रीम की व्याख्या करेगा
मिलान जरिक

87

मुझे नोवा के आसपास वास्तविक बेंचमार्क आंकड़े खोजने के लिए बहुत सारी खुदाई करनी पड़ी, इसलिए मुझे लगा कि मैं एक त्वरित सारांश साझा करूंगा।

  • यदि आपकी संग्रहीत कार्यविधि किसी लौटाए गए परिणामों के साथ बहुत तेज़ संचालन करने के लिए एक कर्सर का उपयोग करती है, तो NOCOUNT OFF होने पर लगभग 10 गुना समय लग सकता है। 1 यह सबसे खराब स्थिति है।
  • अपने संग्रहीत प्रक्रिया केवल कोई लौटाए गए परिणाम के साथ एक एकल त्वरित आपरेशन, NOCOUNT सेटिंग प्रदर्शन करते हैं तो हो सकता है एक 3% प्रदर्शन को बढ़ावा देने के आसपास उपज। 2 यह एक विशिष्ट इंसर्ट या अपडेट प्रक्रिया के अनुरूप होगा। (इस सवाल पर टिप्पणी के बारे में कुछ चर्चा के लिए देखें कि यह हमेशा तेज क्यों नहीं हो सकता है।)
  • यदि आपकी संग्रहीत प्रक्रिया परिणाम लौटाती है (यानी आप कुछ का चयन करते हैं), तो परिणाम अंतर सेट के आकार के साथ अनुपात में कम हो जाएगा।

5
+1 कर्सर पर प्रभाव के लिए, यह मेरी टिप्पणियों के अनुरूप है
zvolkov

बिंदु 2 सटीक नहीं है! मेरा मतलब है कि यह जिस ब्लॉग का जिक्र कर रहा है। कभी नहीं था! यदि NO_COUNT को ON या OFF पर सेट किया गया है, तो DONE और DONEPROC और DONEINPROC को समान आकार के साथ भेजा जाता है। RowCount अभी भी ULONGLONG (64 बाइट्स) के रूप में है और ध्वज DONE_COUNT अभी भी है, लेकिन बिट मान 0. है। SQL सर्वर किसी भी तरह से पंक्तियों की संख्या की गणना करेगा, यहां तक ​​कि आप DONE टोकन से मान पढ़ने के लिए इच्छुक नहीं हैं। यदि आप @@ पढ़ते हैं तो आपने रिटर्न स्ट्रीम के रूप में या किसी अन्य कोमेटाडाटा + पंक्ति टोकन के रूप में अधिक बाइट्स टोकन स्ट्रीम जोड़ दी हैं!
मिलन जरिक

@MilanJaric: उस कॉलिंग के लिए धन्यवाद। आपने मुझे यह महसूस करने में मदद की कि मैं गलत लेख से जुड़ा हूँ। लिंक अब अपडेट किया गया है, और लेख यह दिखाने के लिए एक सम्मोहक तर्क देता है कि SET NOCOUNT ON के साथ थोड़ा सा प्रदर्शन सुधार हो सकता है। क्या आपको लगता है कि इस्तेमाल किए गए बेंचमार्क तरीकों से समस्याएं हैं?
स्ट्रिपलिंगवर्यर

:) अभी भी सेट नॉट ऑफ / ऑन के बारे में गलत है, त्रुटि यह है कि दूसरे एसपी के पास नहीं है SET NOCOUNT OFF;और यही कारण है कि उन्हें लगता है कि उन्हें प्रतिक्रिया में अतिरिक्त बाइट्स नहीं मिल रहे हैं। सटीक बेंचमार्क SET NOCOUNT ONबाएं और SET NOCOUNT OFFदाएं संग्रहीत कार्यविधि में उपयोग करना होगा । इस तरह से आप के साथ टीडीएस पैकेज मिल जाएगा DONEINPROC (SET NOCOUNT ...)फिर से, दस DONEINPROC (INSERT statement), और फिर RETURNVALUE(@@ROWCOUNT), तो RETURNSTATUS 0एसपी के लिए और अंत में DONPROC। त्रुटि इसलिए है क्योंकि दूसरे स्थान पर शरीर में SET NOCOUNT OFF नहीं है!
मिलान जर्क

जो कुछ भी उन्हें मिला, उसे फिर से लिखने के लिए, उन्हें एहसास नहीं हुआ कि यदि आपके पास 1K फ़ेच कर्सर है, तो पहले कनेक्शन के लिए NOCOUNT को ON या OFF पर सेट करने के लिए एक अनुरोध करें और फिर कुछ बैंडविड्थ बचाने के लिए कर्सर कनेक्शन 1K बार कॉल करने के लिए उसी कनेक्शन का उपयोग करें। नोव ऑन या ऑफ के लिए वास्तविक कनेक्शन स्थिति बैंडविड्थ को प्रभावित नहीं करेगी, यह सिर्फ क्लाइंट लिबास जैसे ADO.net या ODBC को भ्रमित कर सकता है। तो "अगर आप बैंडविड्थ के बारे में परवाह नहीं करते हैं, तो" सेट का उपयोग न करें ":)
मिलान जरिक

77
  • जब SET NOCOUNT चालू होता है, तो गिनती (एक Transact-SQL स्टेटमेंट से प्रभावित पंक्तियों की संख्या का संकेत) नहीं दी जाती है। जब सेट नॉट ऑफ हो, तो गिनती वापस आ जाती है। इसका उपयोग किसी भी SELECT, INSERT, UPDATE, DELETE स्टेटमेंट के साथ किया जाता है।

  • सेट नोव की सेटिंग निष्पादन या रन समय पर सेट की जाती है और पार्स समय पर नहीं।

  • सेट पर संग्रहीत कार्यविधि (SP) के प्रदर्शन को सुधारता है।

  • सिंटैक्स: सेट नॉट {ON | रवाना}

सेट नोव ऑन का उदाहरण:

यहां छवि विवरण दर्ज करें

सेट नोव ऑफ का उदाहरण:

यहां छवि विवरण दर्ज करें


7
स्क्रीनशॉट के साथ समझने में आसान और त्वरित। अच्छा काम। :)
शाइजुत

35

मुझे लगता है कि यह डीबीए बनाम डेवलपर समस्या है।

एक देव के रूप में ज्यादातर, मैं कहता हूं कि इसका उपयोग तब तक न करें जब तक कि आप पूरी तरह से सकारात्मक न हों - क्योंकि इसका उपयोग करने से आपका ADO.NET कोड टूट सकता है (जैसा कि Microsoft द्वारा प्रलेखित है)।

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

इसके अलावा, यदि आपके देवता कभी भी ADO.NET की ExecuteNonQueryविधि कॉल द्वारा लौटाए जा रहे "RecordsAffected" का उपयोग करते हैं, तो यदि SET NOCOUNT ONआप इस मामले में सभी का उपयोग करते हैं, तो आप परेशानी में पड़ जाएंगे, ExecuteNonQuery हमेशा 0 वापस आ जाएगा।

पीटर ब्रोमबर्ग का ब्लॉग पोस्ट भी देखें और उनकी स्थिति देखें।

तो यह वास्तव में नीचे उबलता है जो मानकों को सेट करने के लिए हो जाता है :-)

न घुलनेवाली तलछट


हालांकि वह साधारण CRUD के बारे में है: डेटा ग्रिड जिसका वह उल्लेख करता है कि वह गोल यात्राओं आदि से बचने के लिए कई पंक्तियों को भेजने के लिए xml का उपयोग कर सकता है
gbn

मुझे लगता है कि यदि आप SqlDataAdapters का उपयोग कभी नहीं करते हैं, और आप कभी भी जाँच नहीं करते हैं और ExecuteNonQuery द्वारा लौटाए गए "रिकॉर्ड प्रभावित" नंबर पर भरोसा करते हैं (उदाहरण के लिए यदि आप Linq-to-SQL या NHibernate जैसी किसी चीज़ का उपयोग करते हैं), तो आपको शायद कोई समस्या नहीं है सभी संग्रहीत procs में सेट पर नोव का उपयोग करना।
अक्टूबर को marc_s

12

यदि आप कह रहे हैं कि आपके पास अलग-अलग क्लाइंट हो सकते हैं, तो क्लासिक ADO के साथ समस्याएँ हैं यदि SET NOCOUNT को सेट नहीं किया गया है।

एक मैं नियमित रूप से अनुभव करता हूं: यदि एक संग्रहीत प्रक्रिया कई बयानों को निष्पादित करती है (और इस तरह "xxx पंक्तियां प्रभावित" संदेश की एक संख्या वापस आ जाती है), ADO इसे संभाल नहीं पाता है और त्रुटि को फेंकता है "रिकॉर्ड्स ऑब्जेक्ट की ActiveConnection संपत्ति को बदल नहीं सकता है" जिसके पास अपने स्रोत के रूप में एक कमांड ऑब्जेक्ट है। "

इसलिए मैं आम तौर पर इसे स्थापित करने की वकालत करता हूं जब तक कि वास्तव में वास्तव में अच्छा कारण न हो। आपको वास्तव में अच्छा कारण मिल सकता है जिसके लिए मुझे और अधिक पढ़ने और पढ़ने की आवश्यकता है।


9

चीजों को और अधिक जटिल बनाने के जोखिम पर, मैं उन सभी के लिए थोड़ा अलग नियम को प्रोत्साहित करता हूं जिन्हें मैं ऊपर देखता हूं:

  • हमेशा सेट NOCOUNT ON, एक proc के शीर्ष पर इससे पहले कि आप proc में कोई काम नहीं है, लेकिन यह भी हमेशा SET NOCOUNT OFFसंग्रहीत proc से किसी भी recordsets लौटने से पहले फिर से,।

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


धन्यवाद। आप डेटासेट या निश्चित रूप से उपभोग करने वाले कंटेनर से पंक्तिबद्ध हो सकते हैं, लेकिन उपयोगी हो सकते हैं। हम सेलेक्टर्स पर ट्रिगर नहीं कर सकते हैं इसलिए यह सुरक्षित होगा: अधिकांश ग्राहक त्रुटियां डेटा परिवर्तनों पर स्पष्ट संदेशों के कारण होती हैं।
gbn

इस नियम के साथ समस्या यह है कि "खरीद के शीर्ष पर सेट करें" की तुलना में परीक्षण करना कठिन है; मुझे आश्चर्य है कि क्या एसक्यूएल एनलाइट जैसे एसक्यूएल विश्लेषण उपकरण उस तरह की चीज के लिए परीक्षण कर सकते हैं ... इसे मेरी एसक्यूएल फॉर्मेट परियोजना के लिए मेरी लंबी अवधि की टूडू सूची में जोड़ना :)
ताओ

5

NHibernate को तोड़ने वाले ट्रिगर्स के बारे में, मुझे वह अनुभव पहले हाथ से मिला था। मूल रूप से, जब NH एक UPDATE करता है, तो इससे कुछ निश्चित पंक्तियों के प्रभावित होने की उम्मीद होती है। ट्रिगर्स पर सेट नोव ऑन को जोड़ने से आपको पंक्तियों की संख्या वापस मिल जाती है जो एनएच को उम्मीद है कि जिससे समस्या ठीक हो। तो हाँ, मैं निश्चित रूप से इसे ट्रिगर के लिए बंद करने की सलाह दूंगा यदि आप एनएच का उपयोग करते हैं।

एसपी में उपयोग के संबंध में, यह व्यक्तिगत प्राथमिकता का मामला है। मैंने हमेशा पंक्ति की गिनती को बंद कर दिया था, लेकिन फिर, कोई वास्तविक मजबूत तर्क नहीं है।

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


1
मैं संग्रहीत procs से दूर जाने से असहमत हूं। इसका मतलब है कि हमारे पास 2 अलग-अलग क्लाइंट कोड बेस में एक ही एसक्यूएल होना चाहिए और हमारे क्लाइंट कोडर्स पर भरोसा करना चाहिए। हम डेवलपर डीबीए हैं। और क्या आपका मतलब "SET NOCOUNT ON " नहीं है?
gbn

@CodeBlend: सिर्फ Google के लिए यह आपकी जरूरत से ज्यादा है। हालाँकि ... stackoverflow.com/a/4040466/27535
gbn

3

मैं खुद को सत्यापित करना चाहता था कि S सेट नोव ऑन ’न तो नेटवर्क पैकेट बचाता है और न ही राउंडट्रिप

मैंने एक अन्य होस्ट पर एक परीक्षण SQLServer 2017 का उपयोग किया (मैंने एक वीएम का उपयोग किया) create table ttable1 (n int); insert into ttable1 values (1),(2),(3),(4),(5),(6),(7) go create procedure procNoCount as begin set nocount on update ttable1 set n=10-n end create procedure procNormal as begin update ttable1 set n=10-n end फिर मैंने पोर्ट 1433 पर उपकरण 'वेयरशार्क': 'कैप्चर फ़िल्टर' बटन -> 'पोर्ट 1433' के साथ पैकेट का पता लगाया।

exec procNoCount

यह प्रतिक्रिया पैकेट है: 0000 00 50 56 c0 00 08 00 0c 29 31 3f 75 08 00 45 00 0010 00 42 d0 ce 40 00 40 06 84 0d c0 a8 32 88 c0 a8 0020 32 01 05 99 fe a5 91 49 e5 9c be fb 85 01 50 18 0030 02 b4 e6 0e 00 00 04 01 00 1a 00 35 01 00 79 00 0040 00 00 00 fe 00 00 e0 00 00 00 00 00 00 00 00 00

exec procNormal

यह प्रतिक्रिया पैकेट है: 0000 00 50 56 c0 00 08 00 0c 29 31 3f 75 08 00 45 00 0010 00 4f d0 ea 40 00 40 06 83 e4 c0 a8 32 88 c0 a8 0020 32 01 05 99 fe a5 91 49 e8 b1 be fb 8a 35 50 18 0030 03 02 e6 1b 00 00 04 01 00 27 00 35 01 00 ff 11 0040 00 c5 00 07 00 00 00 00 00 00 00 79 00 00 00 00 0050 fe 00 00 e0 00 00 00 00 00 00 00 00 00

लाइन ४० पर मैं I 07 ’देख सकता हूं जो s पंक्ति (नों) प्रभावित’ की संख्या है। यह प्रतिक्रिया पैकेट में शामिल है। कोई अतिरिक्त पैकेट नहीं।

हालांकि इसमें 13 अतिरिक्त बाइट्स हैं, जिन्हें बचाया जा सकता है, लेकिन स्तंभ के नामों को कम करने की तुलना में संभवतः इसके लायक नहीं है (उदाहरण के लिए 'मैनेजडेपबॉक्स' से 'एमडी' तक)

इसलिए मुझे प्रदर्शन के लिए इसका उपयोग करने का कोई कारण नहीं दिखता है

लेकिन जैसा कि दूसरों ने उल्लेख किया है कि यह ADO.NET को तोड़ सकता है और मैंने भी अजगर का उपयोग कर एक मुद्दे पर ठोकर खाई: MSSQL2008 - पयोडबक - पिछला एसक्यूएल एक क्वेरी नहीं था

तो शायद एक अच्छी आदत अभी भी ...


1
SET NOCOUNT ON;

क्वेरी के निष्पादन में प्रभावित संख्या पंक्तियों को वापस नहीं करने के लिए SQL में कोड की इस लाइन का उपयोग किया जाता है। यदि हमें प्रभावित पंक्तियों की संख्या की आवश्यकता नहीं है, तो हम इसका उपयोग कर सकते हैं क्योंकि यह मेमोरी के उपयोग को बचाने में मदद करेगा और क्वेरी के निष्पादन में वृद्धि करेगा।


2
ध्यान दें कि @@ ROWCOUNT अभी भी सेट है। SQL सर्वर पर क्लाइंट को भेजने वाली किसी भी अतिरिक्त प्रतिक्रिया को दबाएं। कृपया ऊपर दिए गए स्वीकृत उत्तर को देखें
gbn

1

सेट पर हस्ताक्षर; उपरोक्त कोड डीएमएल / डीडीएल कमांड के निष्पादन के बाद सीक्वल सर्वर इंजन द्वारा सामने वाले परिणाम विंडो पर उत्पन्न संदेश को रोक देगा।

हम ऐसा क्यों करते हैं? जैसा कि एसक्यूएल सर्वर इंजन स्टेटस प्राप्त करने और मैसेज जेनरेट करने के लिए कुछ संसाधन लेता है, इसे Sql सर्वर इंजन पर अधिभार माना जाता है। इसलिए हम नॉनकाउंट संदेश को सेट करते हैं।


1

एक जगह ऐसा SET NOCOUNT ON वास्तव में मदद कर सकती वह है जहां आप लूप या कर्सर में प्रश्न कर रहे हैं। यह बहुत सारे नेटवर्क ट्रैफ़िक को जोड़ सकता है।

CREATE PROCEDURE NoCountOn
AS
set nocount on
    DECLARE @num INT = 10000
    while @num > 0
    begin
       update MyTable SET SomeColumn=SomeColumn
       set @num = @num - 1
    end
GO


CREATE PROCEDURE NoCountOff
AS
set nocount off
    DECLARE @num INT = 10000
    while @num > 0
    begin
       update MyTable SET SomeColumn=SomeColumn
       set @num = @num - 1
    end
GO

SSMS में ग्राहक आंकड़ों को चालू करना, का एक भाग EXEC NoCountOnऔरEXEC NoCountOff पता चलता है NoCountOff एक पर एक अतिरिक्त 390KB यातायात नहीं था:

ग्राहक आँकड़े

शायद लूप या कर्सर में प्रश्न करने के लिए आदर्श नहीं है, लेकिन हम आदर्श दुनिया में भी नहीं रहते हैं :)


0

मुझे पता है कि यह बहुत पुराना सवाल है। लेकिन सिर्फ अपडेट के लिए।

"सेट नॉट ऑन" का उपयोग करने का सबसे अच्छा तरीका यह है कि इसे अपने एसपी में पहले बयान के रूप में रखा जाए और अंतिम सेलेक्ट स्टेटमेंट से ठीक पहले इसे फिर से सेट किया जाए।


-1

मुझे नहीं पता कि ग्राहक और एसक्यूएल के बीच सेट नोव का परीक्षण कैसे किया जाए, इसलिए मैंने अन्य एसईटी कमांड के लिए एक समान व्यवहार का परीक्षण किया "सेट ट्रांसलेशन इज़ेक्शन लेवल रीड अन-कम"

मैंने अपने कनेक्शन से SQL के डिफ़ॉल्ट व्यवहार (READ COMMITTED) को बदलते हुए एक कमांड भेजा, और इसे अगले कमांड्स के लिए बदल दिया गया। जब मैंने संग्रहित प्रक्रिया के अंदर ISOLATION स्तर को बदल दिया, तो यह अगले कमांड के लिए कनेक्शन व्यवहार को नहीं बदलता था।

वर्तमान निष्कर्ष,

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

मुझे लगता है कि यह अन्य सेट कमांड के लिए प्रासंगिक है जैसे "सेट नोव ऑन"


क्या आपकी बात 1 से ऊपर है कि आपको वास्तव में SET NOCOUNT OFF करने की आवश्यकता नहीं है क्योंकि यह वैश्विक पर्यावरण को प्रभावित नहीं करता है?
फंकीमुशरूम

मुझे यकीन नहीं है कि यदि वह बिंदु 1 के साथ क्या करता है, लेकिन मेरे परीक्षणों में हां, जाहिरा तौर पर वैश्विक वातावरण एक संग्रहीत प्रक्रिया के अंदर सेट नो पर प्रभावित नहीं होता है।
डग २

यह तुलना का एक खराब विकल्प था, क्योंकि अलगाव का स्तर स्पष्ट रूप से एक विशेष लेनदेन से संबंधित है, इसलिए इसकी स्थापना के अनुरूप होने की उम्मीद करने का कोई विशेष कारण नहीं हैNOCOUNT
IMSoP

-1

अगर (कोई गिनती नहीं == बंद)

{तब यह डेटा को रखेगा कि कितने रिकॉर्ड प्रभावित हुए हैं ताकि प्रदर्शन कम हो जाए} और {यह परिवर्तनों के रिकॉर्ड को ट्रैक नहीं करेगा इसलिए परफेक्टनेस में सुधार करें}}


-1

कभी-कभी सरलतम चीजें भी फर्क कर सकती हैं। इन सरल वस्तुओं में से एक जो हर संग्रहीत प्रक्रिया का हिस्सा होना चाहिए SET NOCOUNT ON। संग्रहीत कार्यविधि के शीर्ष पर रखी गई कोड की यह एक पंक्ति उन संदेशों को बंद कर देती है जो SQL सर्वर क्लाइंट को प्रत्येक T-SQL स्टेटमेंट के निष्पादित होने के बाद वापस भेजता है। यह सभी के लिए किया जाता है SELECT, INSERT, UPDATE, और DELETEबयान। जब आप किसी क्वेरी विंडो में T-SQL स्टेटमेंट चलाते हैं, तो यह जानकारी होना आसान है, लेकिन जब संग्रहीत कार्यविधियाँ चलाई जाती हैं, तो इस जानकारी को क्लाइंट को वापस भेजने की कोई आवश्यकता नहीं है।

नेटवर्क से इस अतिरिक्त ओवरहेड को हटाकर यह आपके डेटाबेस और एप्लिकेशन के लिए समग्र प्रदर्शन में सुधार कर सकता है।

यदि आपको अभी भी टी-एसक्यूएल स्टेटमेंट से प्रभावित पंक्तियों की संख्या प्राप्त करने की आवश्यकता है जो आप निष्पादित कर रहे हैं तब भी @@ROWCOUNTविकल्प का उपयोग कर सकते हैं । SET NOCOUNT ONइस फ़ंक्शन को जारी करके ( @@ROWCOUNT) अभी भी काम करता है और अभी भी आपकी संग्रहीत प्रक्रियाओं में उपयोग किया जा सकता है ताकि यह पहचान सके कि बयान से कितनी पंक्तियाँ प्रभावित हुई थीं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.