SELECT स्टेटमेंट में NOLOCK हिंट का प्रभाव


199

मुझे लगता है कि असली सवाल यह है:

अगर मुझे गंदे पढ़े जाने की परवाह नहीं है, तो (NOLOCK) संकेत के साथ एक SELECT स्टेटमेंट जोड़ने से प्रदर्शन प्रभावित होगा:

  1. वर्तमान चयन कथन
  2. दी गई तालिका के खिलाफ अन्य लेनदेन

उदाहरण:

Select * 
from aTable with (NOLOCK)

3
ये SO और DBA उत्तर थोड़े स्पष्ट हैं कि वास्तव में क्या हो रहा है।
ट्रिस्पेड

जवाबों:


289

1) हां , एक चयन NOLOCKएक सामान्य चयन की तुलना में तेजी से पूरा होगा।

2) हां , एक चुनिंदा NOLOCKप्रभाव वाली तालिका के खिलाफ अन्य प्रश्नों को सामान्य चयन की तुलना में तेजी से पूरा करने की अनुमति देगा।

ऐसा क्यों होगा?

NOLOCKआम तौर पर (आपके डीबी इंजन पर निर्भर करता है) का मतलब है कि मुझे अपना डेटा दें, और मुझे परवाह नहीं है कि यह किस स्थिति में है, और जब आप इससे पढ़ते हैं तब भी इसे दबाए रखने से परेशान न हों। यह सब एक बार तेज, कम संसाधन-गहन और बहुत खतरनाक है।

आपको चेतावनी दी जानी चाहिए कि किसी भी सिस्टम से किसी भी अपडेट को कभी भी अपडेट न करें या न करें, या जहां NOLOCKरीड से उत्पन्न डेटा का उपयोग करके पूर्ण शुद्धता की आवश्यकता है । यह पूरी तरह से संभव है कि इस डेटा में पंक्तियाँ हैं जो क्वेरी के चलने के दौरान हटा दी गई थीं या जिन्हें अन्य सत्रों में हटा दिया गया है जिन्हें अंतिम रूप दिया जाना बाकी है। यह संभव है कि इस डेटा में ऐसी पंक्तियाँ शामिल हैं जिन्हें आंशिक रूप से अपडेट किया गया है। यह संभव है कि इस डेटा में रिकॉर्ड शामिल हैं जो विदेशी कुंजी बाधाओं का उल्लंघन करते हैं। यह संभव है कि यह डेटा उन पंक्तियों को बाहर करता है जिन्हें तालिका में जोड़ा गया है लेकिन अभी तक प्रतिबद्ध नहीं हैं।

आपके पास वास्तव में यह जानने का कोई तरीका नहीं है कि डेटा की स्थिति क्या है।

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

हमेशा NOLOCKबड़ी सावधानी के साथ संकेत का उपयोग करें और किसी भी डेटा का इलाज करें जो इसे संदिग्ध रूप से देता है।


धन्यवाद। यह वही है जो मैं मान रहा हूं, लेकिन एक सहयोगी द्वारा इसके बारे में पूछताछ की गई थी और मेरे शुरुआती शोध ने मुझे खुद से सवाल किया। SQLServer 2005 प्रलेखन का कहना है कि NOLOCK के साथ सभी चयनित बयानों के लिए डिफ़ॉल्ट लॉकिंग योजना है! मैं तब अनुमान लगाऊंगा कि मेरे संकेत बेमानी होंगे ...
बॉब प्रोब्स्ट

2
... 2005 और कोई असर नहीं हुआ। हम अभी 2000 रन कर रहे हैं (हमारे विक्रेता के लिए धन्यवाद) और दस्तावेज़ीकरण में कोई समान विवरण नहीं है।
बॉब प्रोबस्ट

4
आपके मित्र को प्रलेखन पढ़ने की आवश्यकता है। तालिका संकेत (लेनदेन-एसक्यूएल) msdn.microsoft.com/en-us/library/ms187373(SQL.90).aspx
पिट्सबर्ग डीबीए

9
साइड नोट: यदि यह सच था, तो यह पूर्ण अराजकता होगी।
पिट्सबर्ग डीबीए

1
अंक 1 और 2 को 1) तक सीमित रखने की आवश्यकता है "... जब टेबल पर एक इन्सर्ट / अपडेट / डिलीट एक्शन लंबित है ।" और 2) "... के विरुद्ध क्वेरीज़ डालने / अपडेट / डिलीट करने की अनुमति देगा ..."। मैं (व्यक्तिगत वरीयता) "तेजी" के उदाहरणों को "जल्दी" में बदल दूंगा क्योंकि अंतर किसी अन्य प्रक्रिया के पूरा होने की प्रतीक्षा कर रहा है।
20

61

साझा किए गए तालों की कमी के कारण, NOLOCK सबसे बेहतर चयन करता है। इसके अलावा, ताले जारी करने की कमी का मतलब है कि लेखकों को आपके SELECT द्वारा बाधित नहीं किया जाएगा।

NOLOCK कार्यात्मक रूप से READ UNCOMMITTED के एक अलगाव स्तर के बराबर है। मुख्य अंतर यह है कि यदि आप चुनते हैं तो आप कुछ तालिकाओं पर NOLOCK का उपयोग कर सकते हैं लेकिन दूसरों का नहीं। यदि आप एक जटिल क्वेरी में सभी तालिकाओं पर NOLOCK का उपयोग करने की योजना बनाते हैं, तो SET TRANSPORTION ISOLATION LEAD READ UNCOMMITTED का उपयोग करना आसान है, क्योंकि आपको हर तालिका के लिए संकेत लागू करने की आवश्यकता नहीं है।

यहां आपके निपटान में सभी अलगाव स्तरों के बारे में जानकारी है, साथ ही तालिका संकेत भी हैं।

सेट परिवहन अलगाव स्तर

तालिका संकेत (लेनदेन-एसक्यूएल)


2
मैं सहमत हूं, लेकिन पूरी तरह से नहीं; यह इंगित करना महत्वपूर्ण है कि एक NO LOCK / READ UNCOMMITTED संकेत वास्तव में क्वेरी की गति में सुधार नहीं करता है, लेकिन अधिक-तो यह तेजी से प्रकट होता है क्योंकि इसे पूरा करने के लिए पिछले प्रश्नों का इंतजार नहीं करना पड़ता है। तो वास्तव में, क्वेरी तेजी से अधिक है, बजाय आईएस तेजी से (मुझे लगता है)।
मोअज़

1
@BorhanMooz वैसे, लॉक मैनेजर से ताले का अनुरोध नहीं करने से बचत होती है। यहां तक ​​कि अगर कोई अन्य प्रश्न इंतजार नहीं कर रहे हैं, तो इसकी एक लागत और एक मेमोरी ओवरहेड है।
पिट्सबर्ग डीबीए

1
मैं अपने कुछ काम के साथियों के साथ इस पर चर्चा कर रहा था। जैसा कि मैं इसे समझता हूं, बिना (NOLOCK) संकेत का उपयोग किए एक क्वेरी को अभी भी स्कीमा-साझा लॉक प्राप्त करने की आवश्यकता है ( mssqltips.com/sqlservertip/2470/… )।
मौज

1
हां, लेकिन पेज या एक्स्टेंट पर हजारों साझा किए गए ताले नहीं। एक स्कीम लॉक वन लॉक है, न कि हजारों। यदि हम पांडित्यपूर्ण होना चाहते हैं, तो हम इस पर बहस जारी रख सकते हैं, लेकिन हां, लॉक ओवरहेड की न्यूनतम मात्रा होगी। बचत महत्वपूर्ण हैं। इस पर गणित करें: msdn.microsoft.com/en-us/library/aa337559(v=sql.100).aspx
पिट्सबर्ग DBA

14

ऊपर बताई गई बातों के अलावा, आपको इस बात का बहुत ध्यान रखना चाहिए कि नोलॉक वास्तव में आपके द्वारा उन पंक्तियों को नहीं उठाने का जोखिम उठाता है जो आपके चयन से पहले की गई हैं।

Http://blogs.msdn.com/sqlcat/archive/2007/02/01/prepretly-committed-rows-might-be-missed-if-nolock-hint-is-used.aspx देखें


6

यह तेजी से होगा क्योंकि इसे ताले के लिए इंतजार नहीं करना पड़ेगा


कितना तेज? क्या आप कोई गति सुधार संख्या प्रदान कर सकते हैं?
यूजेनियु टोरिका

5
"कितना" इस बात पर निर्भर करता है कि आप विशेष रूप से अपने डेटा के साथ क्या कर रहे हैं और आपको कब तक लॉक अधिग्रहण के लिए इंतजार करना होगा।
स्टिंगजैक

एकमात्र सही बेंचमार्क वह है जिसे आप स्वयं बनाते और चलाते हैं। हर कोई आपको बताता है कि "चेक मेल में है" जितना अच्छा है। मैंने अपने स्वयं के बेंचमार्क चलाकर कई मिथकों और धारणाओं को कई बार गलत साबित किया है।
ट्रैविसो

^ @ ट्राविसो - पूरी तरह से सही है। मैंने कुछ समय पहले NOLOCK को धीमा किया है। पूरी तरह से यकीन नहीं क्यों, लेकिन मैं उस का उपयोग कर रहा हूं जब समस्या निवारण और मैं न तो नकारात्मक रूप से (अधिक) उत्पादन को प्रभावित करना चाहता हूं
StingyJack

2
  • इसका उत्तर हां है यदि क्वेरी को एक साथ कई बार चलाया जाता है, क्योंकि प्रत्येक लेनदेन को दूसरों को पूरा करने के लिए इंतजार करने की आवश्यकता नहीं होगी। हालाँकि, यदि क्वेरी को एक बार अपने आप चलाया जाता है तो उत्तर नहीं है।

  • जी हां । वहाँ एक महत्वपूर्ण संभावना है कि (NOLOCK) का सावधानीपूर्वक उपयोग आपके डेटाबेस को गति देगा। इसका अर्थ है कि अन्य लेनदेन को समाप्त होने के लिए इस SELECT कथन का इंतजार नहीं करना पड़ेगा, लेकिन दूसरी ओर, अन्य लेनदेन धीमा हो जाएंगे क्योंकि वे अब एक नए लेनदेन के साथ अपने प्रसंस्करण समय को साझा कर रहे हैं।

केवल उन WITH (NOLOCK)सूचियों पर सेलेक्ट स्टेटमेंट में उपयोग करने के लिए सावधान रहें जिनमें क्लस्टर इंडेक्स है।

(NOLOCK) के साथ अक्सर डेटाबेस पढ़ने के लेनदेन को गति देने के लिए एक जादू के रूप में शोषण किया जाता है।

परिणाम सेट में वे पंक्तियाँ हो सकती हैं जो अभी तक प्रतिबद्ध नहीं हैं, जिन्हें अक्सर बाद में वापस ले लिया जाता है।

यदि बिना (NOLOCK) एक तालिका में लागू किया जाता है जिसमें एक गैर-संकुल सूचकांक होता है तो पंक्ति-अनुक्रमण को अन्य लेनदेन द्वारा बदला जा सकता है क्योंकि पंक्ति डेटा को परिणाम-तालिका में स्ट्रीम किया जा रहा है। इसका मतलब है कि परिणाम-सेट गायब पंक्तियाँ हो सकती हैं या एक ही पंक्ति को कई बार प्रदर्शित कर सकती हैं।

READ COMMITTED एक अतिरिक्त मुद्दा जोड़ता है जहां डेटा एक एकल स्तंभ के भीतर दूषित हो जाता है जहां कई उपयोगकर्ता एक ही सेल को एक साथ बदलते हैं।

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