अनुप्रयोगों के प्रतिसाद करने में धीमे होने के कई कारण हो सकते हैं, लेकिन यदि उपयोगकर्ता प्रदर्शन के बारे में शिकायत कर रहे हैं, तो आप SQL सर्वर गतिरोध से निपट सकते हैं। सौभाग्य से, SQL सर्वर गतिरोध को पहचानने और ठीक करने के तरीके हैं, और यहां तक कि इसे एप्लिकेशन के प्रदर्शन को नकारात्मक रूप से प्रभावित करने से भी रोकते हैं।
SQL सर्वर गतिरोध अनिवार्य रूप से दो प्रक्रियाओं के बीच एक गतिरोध है जो एक ही संसाधन के लिए अनन्य पहुँच के लिए प्रतिस्पर्धा कर रहे हैं। क्योंकि एक समय में केवल एक प्रक्रिया संसाधन का उपयोग कर सकती है, गतिरोध हल होने तक प्रदर्शन धीमा हो जाता है।
देखने के लिए दो प्रकार के SQL सर्वर गतिरोध हैं:रूपांतरण लॉक और साइकिल लॉक।
रूपांतरण लॉक डेडलॉक तब होता है जब कोई थ्रेड लॉक को एक विशेष प्रकार से दूसरे विशिष्ट प्रकार में बदलने का प्रयास करता है, लेकिन ऐसा नहीं हो सकता क्योंकि एक अलग थ्रेड पहले से ही उस संसाधन पर एक साझा लॉक रखता है जिसे पहला थ्रेड कनवर्ट करने का प्रयास कर रहा है।
SQL सर्वर में, तीन प्रकार के कनवर्ज़न लॉक होते हैं:
- इंटेंट एक्सक्लूसिव (छह) के साथ साझा किया गया:यह लॉक तब होता है जब एक साझा लॉक वाले लेनदेन में कुछ पृष्ठों या पंक्तियों पर एक विशेष लॉक भी होता है।
- शेयर्ड विद इंटेंट अपडेट (SIU):यह लॉक तब होता है जब एक शेयर्ड लॉक वाले ट्रांजेक्शन में कुछ पेज या रो भी अपडेट लॉक के साथ लॉक हो जाते हैं।
- इंटेंट एक्सक्लूसिव (यूआईएक्स) के साथ अपडेट:यह लॉक तब होता है जब अपडेट लॉक रखने वाले ट्रांजेक्शन में कुछ पेजों या पंक्तियों पर एक्सक्लूसिव लॉक भी होता है।
साइकिल लॉक SQL सर्वर डेडलॉक हैं जो दो प्रक्रियाओं के कारण होते हैं जो एक संसाधन पर एक विशेष लॉक के लिए होड़ करते हैं जो अन्य प्रक्रिया द्वारा लॉक किया जाता है।
उदाहरण के लिए, प्रक्रिया 1 संसाधन 1 पर ताला लगा रही है जबकि प्रक्रिया 2 के संसाधन 2 पर अपना ताला जारी करने की प्रतीक्षा कर रही है। यदि प्रक्रिया 2 संसाधन 2 पर ताला लगा रही है, जबकि प्रक्रिया 1 संसाधन 1 के जारी होने की प्रतीक्षा कर रही है, तो हमने स्वयं को प्राप्त कर लिया है। एक साइकिल लॉक गतिरोध।
SQL सर्वर गतिरोध का निदान कैसे करें
SQL सर्वर गतिरोध उन दर्जनों संभावित कारणों में से एक है, जिनके कारण आपके एप्लिकेशन में प्रदर्शन संबंधी समस्याएं हो सकती हैं। यदि सामान्य रूप से तेजी से चलने वाली क्वेरी अचानक धीमी हो जाती हैं, तो संभव है कि आपके पास गतिरोध हो। लेकिन यह भी संभव है कि कुछ और हो रहा हो।
इसलिए, कम क्वेरी गति को ध्यान में रखते हुए, आप यह कैसे निर्धारित करते हैं कि आपके डेटाबेस प्रदर्शन समस्याओं के लिए गतिरोध को दोष देना है या नहीं?
गतिरोध की पहचान करने का सबसे आसान और सबसे निश्चित तरीका 1205 त्रुटि संदेश की उपस्थिति है:
लेन-देन (प्रक्रिया आईडी %d) %.*ls संसाधनों पर एक अन्य प्रक्रिया के साथ गतिरोध में था और इसे गतिरोध के शिकार के रूप में चुना गया है। लेन-देन फिर से चलाएँ।
1205 त्रुटि संदेश सचमुच आपको बताता है कि एक गतिरोध है और इसे कैसे ठीक किया जाए। हालाँकि, जैसा कि यिर्मयाह पेस्चका बताते हैं, यदि आपने गतिरोध का कारण तय नहीं किया है, तो लेन-देन को फिर से चलाना शायद असफल होगा।
डेडलॉक खोजने का एक अन्य विकल्प SQL सर्वर डेडलॉक ग्राफ़ को विस्तारित ईवेंट से बाहर निकालना है। विस्तारित घटनाओं के माध्यम से गतिरोध को निकालने से आप गतिरोध XML को देख सकते हैं, जो गतिरोध ग्राफ़ के आलेखीय प्रतिनिधित्व से अधिक जानकारी प्रदान करता है।
डेडलॉक एक्सएमएल पीड़ित सूची, प्रक्रिया सूची और संसाधन सूची द्वारा आयोजित किया जाता है। प्रत्येक अनुभाग गतिरोध में शामिल पीड़ितों, प्रक्रियाओं और संसाधनों का विस्तृत विवरण देता है, जिससे समस्या का निवारण और समाधान करना आसान हो जाता है।
SQL सर्वर गतिरोध को कैसे ठीक करें
SQL सर्वर गतिरोध को हल करने का एकमात्र तरीका प्रक्रियाओं में से एक को समाप्त करना और लॉक किए गए संसाधन को मुक्त करना है ताकि प्रक्रिया पूरी हो सके। यह स्वचालित रूप से तब होता है जब SQL सर्वर एक गतिरोध का पता लगाता है और प्रतिस्पर्धी प्रक्रियाओं में से एक (यानी, पीड़ित) को मार देता है।
SQL सर्वर सामान्य रूप से चुनता है कि किस कनेक्शन को यादृच्छिक रूप से मारना है, लेकिन डेडलॉक प्राथमिकताओं को निर्धारित करना संभव है कि यह निर्धारित करने के लिए कि कौन सा कनेक्शन डेडलॉक के दौरान मारा गया है। जब दो कनेक्शनों में अलग-अलग प्राथमिकता सेटिंग्स होती हैं, तो SQL सर्वर सबसे कम प्राथमिकता वाले लेन-देन को बंद कर देगा।
SQL सर्वर गतिरोध को कैसे रोकें
SQL सर्वर गतिरोध जीवन का एक तथ्य है जब आप एक व्यस्त डेटाबेस का प्रबंधन कर रहे होते हैं। हालाँकि, DBA कुछ निवारक उपाय करके गतिरोध की घटना को कम करने और डेटाबेस के प्रदर्शन पर उनके प्रभाव को कम करने में मदद कर सकते हैं:
- बेहतर अनुक्रमणिका बनाएं
- लेन-देन प्राथमिकताओं को समायोजित करें
- कोशिश करें/फिर से प्रयास करें मॉडल लागू करें
- अलगाव मोड बदलें
- लॉक को यथासंभव कम समय के लिए रोक कर रखें
- हर बार उसी क्रम में संसाधनों तक पहुंचें
- कोई लेन-देन तब तक सबमिट न करें जब तक आपके पास वह सारी जानकारी न हो जो आपको चाहिए
- लॉक एस्केलेशन को सीमित करें
हालांकि SQL सर्वर गतिरोध को पूरी तरह से रोकना संभव नहीं है, आप इन सर्वोत्तम प्रथाओं को लागू कर सकते हैं और लेन-देन को सुचारू रूप से चलाने और डेटाबेस के प्रदर्शन को अनुकूलित करने के लिए गतिरोध के कुछ सबसे सामान्य स्रोतों को सक्रिय रूप से दरकिनार कर सकते हैं।