क्या NOLOCK हमेशा खराब होता है?


34

मैं एक रिपोर्ट डेवलपर हूं जो मेरे प्रश्नों को यथासंभव कुशल बनाना चाहता है। मैं एक डीबीए के साथ काम करता था जिसने मुझे बताया - मुझे विश्वास है क्योंकि मैं हमेशा एक प्रोडक्शन सर्वर पर रिपोर्ट के साथ काम कर रहा था - NOLOCKहर एक क्वेरी में उपयोग करने के लिए ।

अब, मैं एक डीबीए के साथ काम करता हूं, जिसने NOLOCKकिसी भी परिस्थिति में प्रतिबंध लगा दिया है - तब भी जब मेरी एक रिपोर्ट (कुछ तालिकाओं में अनुक्रमित की काफी कमी के कारण) प्रतिकृति और सिस्टम अपडेट रोक रही है। मेरी राय में, इस मामले में, NOLOCKएक अच्छी बात होगी।

चूंकि मेरे अधिकांश एसक्यूएल प्रशिक्षण में बहुत अलग राय के साथ विभिन्न डीबीए आए हैं, इसलिए मैं इसे डीबीए की एक विस्तृत विविधता से पूछना चाहता था।


1
इस चर्चा का दूसरा पक्ष: dba.stackexchange.com/q/2684/2660
Nick Chammas

जवाबों:


30

यदि आपकी रिपोर्ट अपडेट करती है कि आपका डीबीए सही है: आपको बिल्कुल उपयोग नहीं करना चाहिए NOLOCK। बहुत तथ्य यह है कि संघर्ष हैं एक स्पष्ट संकेत है कि यदि आप गंदे रीड का उपयोग करेंगे तो आपको गलत रिपोर्ट मिलेगी।

मेरी राय में, हमेशा से बेहतर विकल्प हैं NOLOCK:

  • क्या आपके प्रोडक्शन टेबल केवल प्रभाव में पढ़े जाते हैं और कभी संशोधित नहीं होते हैं? डेटाबेस केवल पढ़ने के लिए चिह्नित करें!
  • टेबल स्कैन के कारण लॉक टकराव होता है? तालिकाओं को उचित रूप से अनुक्रमित करें, लाभ कई हैं।
  • संशोधित नहीं कर सकता / नहीं जानता कि कैसे उचित रूप से अनुक्रमित किया जाए? SNAPSHOT अलगाव का उपयोग करें ।
  • स्नैपशॉट का उपयोग करने के लिए ऐप नहीं बदल सकते? पढ़ें प्रतिबद्ध स्नैपशॉट चालू करें !
  • आपने पंक्ति संस्करण के प्रभाव को मापा है और इसका सबूत है कि यह प्रदर्शन को प्रभावित करता है? आप डेटा को अनुक्रमित नहीं कर सकते हैं? और आप गलत रिपोर्टों के साथ ठीक हैं ? फिर बहुत कम से कम अपने आप को एक एहसान और उपयोग करें SET TRANSACTION ISOLATION LEVEL, एक क्वेरी संकेत नहीं। बाद में हर क्वेरी को संशोधित करने के बजाय अलगाव स्तर को ठीक करना आसान होगा।

6
सावधान रहें: रीड प्रतिबद्ध स्नैपशॉट को चालू करने से कुछ कोड टूट सकते हैं।
एके

33

यह हमेशा बुरा नहीं होता है

निश्चित रूप से यह आपको बिना पढ़े मानों को पढ़ने की अनुमति देता है (जो कि कभी भी वापस लौटाया जा सकता है और इसलिए तार्किक रूप से कभी अस्तित्व में नहीं होता है) और साथ ही कई बार मानों को पढ़ने की अनुमति भी देता है।

केवल अलगाव स्तर जो गारंटी देते हैं कि आप ऐसी किसी भी विसंगति का सामना नहीं करेंगे, वे क्रमबद्ध / स्नैपशॉट हैं। एक पंक्ति में ले जाने से पहले (यदि किसी कुंजी अद्यतन के कारण) स्कैन से पहले इस पंक्ति तक पहुँचने पर दोहराए जाने योग्य रीड वैल्यू को याद किया जा सकता है, तो रीड कमिट के तहत दो बार पढ़ा जा सकता है यदि एक महत्वपूर्ण अपडेट के कारण आगे पढ़ने के लिए पहले की पंक्ति बढ़ती है।

nolockहालाँकि, इन मुद्दों के तहत उत्पन्न होने की अधिक संभावना है , क्योंकि डिफ़ॉल्ट रूप से, इस अलगाव स्तर पर यह आवंटन आदेशित स्कैन का उपयोग करेगा जब यह अनुमान लगाता है कि 64 पृष्ठों से अधिक पढ़ा जाना है । अंकों की अद्यतन के कारण पृष्ठों के बीच आने वाली समस्याओं की श्रेणी के साथ-साथ ये आवंटन आदेशित स्कैन भी पृष्ठ विभाजन के साथ मुद्दों के लिए असुरक्षित होते हैं (जहां पंक्तियाँ याद की जा सकती हैं यदि नया आवंटित पृष्ठ बिंदु से पहले फ़ाइल में है यदि पहले से स्कैन किया गया पृष्ठ फ़ाइल में बाद के पृष्ठ पर विभाजित है) तो पहले से ही स्कैन या दो बार पढ़ा जा सकता है)।

सरल (एकल तालिका) के लिए कम से कम यह इन स्कैन के उपयोग को हतोत्साहित और एक कुंजी पर स्कैन का आदेश दिया पाने के लिए संभव है प्रश्नों nolockबस एक जोड़कर ORDER BY index_keyक्वेरी के लिए इतना है कि Orderedकी संपत्ति IndexScanहै true

लेकिन अगर आपके रिपोर्टिंग एप्लिकेशन को बिल्कुल सटीक आंकड़ों की आवश्यकता नहीं है और ऐसी विसंगतियों की अधिक संभावना को सहन कर सकते हैं तो यह स्वीकार्य हो सकता है।

लेकिन निश्चित रूप से आपको इसे सभी प्रश्नों पर इस उम्मीद में नहीं करना चाहिए कि यह जादू "टर्बो" बटन है। साथ ही उस अलगाव के स्तर पर विसंगतिपूर्ण परिणामों के सामना करने की अधिक संभावना या कोई परिणाम नहीं मिला ("डेटा आंदोलन के कारण NOLOCK के साथ स्कैन जारी नहीं रख सका" त्रुटि) यहां तक ​​कि ऐसे मामले भी हैं जहां प्रदर्शन nolock बहुत खराब हो सकता है


3
+1 - हम इसका बहुत उपयोग करते हैं क्योंकि हमारी उत्पादन तालिकाएँ कभी संशोधित नहीं होती हैं।
जेएनके

@ जेएनके आप कभी भी संशोधित नहीं होने का क्या मतलब है?
कुबेरचुन

4
मार्टिन, मैं थोड़ा अलग शब्दों का सुझाव दूंगा: "पढ़ने के लिए प्रतिबद्ध मूल्यों के तहत दोनों को याद किया जा सकता है और एक से अधिक बार पढ़ा जा सकता है"। हम कुछ विदेशी मामलों में दो बार से अधिक एक पंक्ति प्राप्त कर सकते हैं।
एके

@ StarShip3000 हम उत्पादन के लिए जो डेटा तैनात करते हैं, वह मूल रूप से केवल अंतिम उपयोगकर्ताओं के लिए ही पढ़ा जाता है, इसलिए उनके अधिकांश विचारों में NOLOCK संकेत हैं
JNK

11

क्या आपके ग्राहक रिपोर्ट में असंगत परिणामों को सहन करते हैं? यदि उत्तर नहीं है, तो आपको NOLOCK का उपयोग नहीं करना चाहिए - आप संगामिति के तहत गलत परिणाम प्राप्त कर सकते हैं। मैं कुछ उदाहरण लिखा था यहाँ , यहाँ , और यहाँ । ये उदाहरण READ COMMITTED और REPEATABLE READ के तहत असंगत आउटपुट को दर्शाते हैं, लेकिन आप उन्हें ट्विक कर सकते हैं और साथ ही NOLOCK के साथ गलत परिणाम प्राप्त कर सकते हैं।


मेरे द्वारा बनाई गई अधिकांश रिपोर्टें वर्तमान डेटा पर नहीं चल रही हैं। अधिकांश ग्राहक रिपोर्ट चला रहे हैं वे कल के डेटा हैं। क्या आपका जवाब बदल जाता अगर ऐसा होता?
डाटागर्ल

8

मेरे द्वारा बनाई गई अधिकांश रिपोर्टें वर्तमान डेटा पर नहीं चल रही हैं। अधिकांश ग्राहक रिपोर्ट कर रहे हैं कल के डेटा हैं। क्या आपका जवाब बदल जाता अगर ऐसा होता?

अगर ऐसा है, तो आपके पास एक और संभावित विकल्प है:
उत्पादन डेटाबेस पर अपने प्रश्नों को चलाने और ताले के साथ खिलवाड़ करने के बजाय NOLOCK, आप अपनी रिपोर्ट उत्पादन डेटाबेस की एक प्रति से चला सकते हैं।

आप इसे सेट कर सकते हैं ताकि यह प्रत्येक रात बैकअप से स्वचालित रूप से बहाल हो जाए
जाहिरा तौर पर आपकी रिपोर्टें ग्राहक की साइटों पर सर्वर पर चल रही हैं, इसलिए मुझे नहीं पता कि इसे स्थापित करना आपके लिए एक व्यवहार्य समाधान होगा।
(लेकिन फिर फिर ... उनके पास वैसे भी बैकअप होना चाहिए, इसलिए आपको उन्हें पुनर्स्थापित करने के लिए कुछ सर्वर स्थान की आवश्यकता है)

मैं एक इन-हाउस डेवलपर हूं, इसलिए मेरे लिए यह आसान है क्योंकि सर्वर और डेटाबेस पर मेरा पूरा नियंत्रण है।

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

मेरे पास काम के दौरान भी यही स्थिति है:
हम लगभग सभी रिपोर्टिंग सामानों के लिए इस तरह से एक उत्पादन डेटाबेस कॉपी का उपयोग कर रहे हैं, लेकिन कुछ प्रश्न हैं जिनके लिए आज के डेटा की आवश्यकता है।


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