डेटाबेस पेशेवरों को नियमित रूप से डेटाबेस के प्रदर्शन के मुद्दों का सामना करना पड़ता है जैसे कि अनुचित अनुक्रमण और उत्पादन SQL उदाहरणों में खराब लिखित कोड। मान लें कि आपने एक लेन-देन अद्यतन किया है और SQL सर्वर ने निम्न गतिरोध संदेश की सूचना दी है। DBA के लिए अभी शुरुआत हो रही है, यह एक झटके के रूप में आ सकता है।
इस लेख में, हम SQL सर्वर गतिरोध और उनसे बचने के सर्वोत्तम तरीकों का पता लगाएंगे।
SQL सर्वर गतिरोध क्या है?
SQL सर्वर एक अत्यधिक लेन-देन वाला डेटाबेस है। उदाहरण के लिए, मान लें कि आप एक ऑनलाइन शॉपिंग पोर्टल के लिए डेटाबेस का समर्थन कर रहे हैं, जहां आपको चौबीसों घंटे ग्राहकों से नए ऑर्डर प्राप्त होते हैं। एक से अधिक उपयोगकर्ता एक ही समय में एक ही गतिविधि कर रहे हैं। इस मामले में, आपके डेटाबेस को एटॉमिकिटी, कंसिस्टेंसी, आइसोलेशन, ड्यूरेबिलिटी (एसीआईडी) गुणों का पालन करना चाहिए ताकि सुसंगत, विश्वसनीय और डेटा अखंडता की रक्षा की जा सके।
नीचे दिया गया चित्र एक रिलेशनल डेटाबेस में ACID गुणों का वर्णन करता है।
एसीआईडी गुणों का पालन करने के लिए, SQL सर्वर लॉकिंग तंत्र, बाधाओं और राइट-फॉरवर्ड लॉगिंग का उपयोग करता है। विभिन्न लॉक प्रकारों में शामिल हैं:एक्सक्लूसिव लॉक (X), शेयर्ड लॉक (S), अपडेट लॉक (U), इंटेंट लॉक (I), स्कीमा लॉक (SCH) और बल्क अपडेट लॉक (BU)। इन तालों को कुंजी, तालिका, पंक्ति, पृष्ठ और डेटाबेस स्तर पर प्राप्त किया जा सकता है।
मान लीजिए आपके पास दो उपयोगकर्ता हैं, जॉन और पीटर जो ग्राहक डेटाबेस से जुड़े हैं।
- जॉन [customerid] 1 वाले ग्राहक के लिए रिकॉर्ड अपडेट करना चाहता है।
- उसी समय, पीटर [customerid] 1 वाले ग्राहक के लिए मूल्य पुनः प्राप्त करना चाहता है।
इस मामले में, SQL सर्वर जॉन और पीटर दोनों के लिए निम्नलिखित लॉक का उपयोग करता है।
जॉन के लिए ताले
- यह ग्राहक तालिका और उस पृष्ठ पर एक इंटेंट एक्सक्लूसिव (IX) लॉक लेता है जिसमें रिकॉर्ड होता है।
- यह आगे उस पंक्ति पर एक विशेष (X) लॉक लेता है जिसे जॉन अपडेट करना चाहता है। यह किसी अन्य उपयोगकर्ता को तब तक पंक्ति डेटा को संशोधित करने से रोकता है जब तक कि प्रक्रिया A अपना लॉक जारी नहीं कर देती।
पीटर के लिए ताले
- यह ग्राहक तालिका और उस पृष्ठ पर एक आशय साझा (IS) लॉक प्राप्त करता है जिसमें जहां क्लॉज के अनुसार रिकॉर्ड होता है।
- यह पंक्ति को पढ़ने के लिए एक साझा लॉक लेने का प्रयास करता है। इस पंक्ति में पहले से ही जॉन के लिए एक विशेष लॉक है।
इस मामले में, पीटर को तब तक प्रतीक्षा करने की आवश्यकता है जब तक कि जॉन अपना काम पूरा नहीं कर लेता और अनन्य लॉक को जारी नहीं कर देता। इस स्थिति को अवरोधन के रूप में जाना जाता है।
अब, मान लीजिए कि एक अन्य परिदृश्य में, जॉन और पीटर के पास निम्नलिखित ताले हैं।
- जॉन के पास ग्राहक आईडी 1 के लिए ग्राहक तालिका पर एक विशेष लॉक है।
- पीटर के पास ग्राहक आईडी 1 के लिए ऑर्डर टेबल पर एक विशेष लॉक है।
- जॉन को अपना लेनदेन पूरा करने के लिए ऑर्डर टेबल पर एक विशेष लॉक की आवश्यकता होती है। पीटर के पास पहले से ही ऑर्डर टेबल पर एक विशेष लॉक है।
- पीटर को अपना लेनदेन पूरा करने के लिए ग्राहक टेबल पर एक विशेष लॉक की आवश्यकता होती है। जॉन के पास पहले से ही ग्राहक टेबल पर एक विशेष लॉक है।
इस मामले में, लेन-देन में से कोई भी आगे नहीं बढ़ सकता है क्योंकि प्रत्येक लेनदेन के लिए दूसरे लेनदेन द्वारा रखे गए संसाधन की आवश्यकता होती है। इस स्थिति को SQL सर्वर गतिरोध के रूप में जाना जाता है।
SQL सर्वर गतिरोध निगरानी तंत्र
SQL सर्वर समय-समय पर डेडलॉक मॉनिटर थ्रेड का उपयोग करके डेडलॉक स्थितियों की निगरानी करता है। यह एक गतिरोध में शामिल प्रक्रियाओं की जाँच करता है और यह पहचानता है कि क्या कोई सत्र गतिरोध का शिकार बन गया है। यह गतिरोध पीड़ित प्रक्रिया की पहचान करने के लिए एक आंतरिक तंत्र का उपयोग करता है। डिफ़ॉल्ट रूप से, रोलबैक के लिए आवश्यक संसाधनों की न्यूनतम राशि वाले लेन-देन को शिकार माना जाता है।
SQL सर्वर पीड़ित सत्र को समाप्त कर देता है ताकि दूसरा सत्र अपने लेनदेन को पूरा करने के लिए आवश्यक लॉक प्राप्त कर सके। डिफ़ॉल्ट रूप से, SQL सर्वर डेडलॉक मॉनिटर का उपयोग करके हर 5 सेकंड में गतिरोध की स्थिति की जाँच करता है। यदि यह एक गतिरोध का पता लगाता है, तो यह गतिरोध की घटना के आधार पर आवृत्ति को 5 सेकंड से घटाकर 100 मिलीसेकंड कर सकता है। यदि बार-बार गतिरोध नहीं होता है, तो यह फिर से मॉनिटरिंग थ्रेड को 5 सेकंड पर रीसेट कर देता है।
एक बार जब SQL सर्वर एक प्रक्रिया को डेडलॉक पीड़ित के रूप में मारता है, तो आपको निम्न संदेश प्राप्त होगा। इस सत्र में, प्रक्रिया आईडी 69 एक गतिरोध पीड़ित था।
SQL सर्वर गतिरोध प्राथमिकता कथनों के उपयोग के प्रभाव
डिफ़ॉल्ट रूप से, SQL सर्वर सबसे कम खर्चीले रोलबैक वाले लेन-देन को गतिरोध के शिकार के रूप में चिह्नित करता है। उपयोगकर्ता DEADLOCK_PRIORITY कथन का उपयोग करके लेनदेन में गतिरोध प्राथमिकता निर्धारित कर सकते हैं।
SET DEADLOCK_PRIORITY
यह निम्नलिखित तर्कों का उपयोग करता है:
- निम्न:यह गतिरोध प्राथमिकता -5 के बराबर है
- सामान्य:यह डिफ़ॉल्ट गतिरोध प्राथमिकता है 0
- उच्च:यह सर्वोच्च गतिरोध प्राथमिकता है 5.
हम गतिरोध प्राथमिकता के लिए -10 से 10 (कुल 21 मान) के लिए संख्यात्मक मान भी सेट कर सकते हैं।
आइए गतिरोध प्राथमिकता वाले बयानों के कुछ उदाहरण देखें।
उदाहरण 1:
गतिरोध प्राथमिकता के साथ सत्र 1:सामान्य (0)> गतिरोध प्राथमिकता वाला सत्र 2:निम्न (-5)
गतिरोध का शिकार: सत्र 2
उदाहरण 2:
डेडलॉक प्राथमिकता के साथ सत्र 1:सामान्य (0) <सत्र 2 गतिरोध प्राथमिकता के साथ:उच्च (+5)
गतिरोध का शिकार: सत्र 1
उदाहरण 3
गतिरोध प्राथमिकता के साथ सत्र 1:-3> गतिरोध प्राथमिकता के साथ सत्र 2:-7
उदाहरण 4:
डेडलॉक प्राथमिकता के साथ सत्र 1:-5 <सत्र 2 गतिरोध प्राथमिकता के साथ:5
गतिरोध का शिकार: सत्र 1
SQL सर्वर गतिरोध ग्राफ़ का उपयोग करके गतिरोध करता है
एक गतिरोध ग्राफ गतिरोध प्रक्रियाओं, उनके ताले और गतिरोध के शिकार का एक दृश्य प्रतिनिधित्व है। हम एक एक्सएमएल और ग्राफिकल प्रारूप में डेडलॉक विवरण जानकारी कैप्चर करने के लिए ट्रेस फ्लैग 1204 और 1222 को सक्षम कर सकते हैं। गतिरोध विवरण प्राप्त करने के लिए हम डिफ़ॉल्ट system_health विस्तारित ईवेंट का उपयोग कर सकते हैं। गतिरोध की व्याख्या करने का एक त्वरित और आसान तरीका गतिरोध ग्राफ के माध्यम से है। आइए एक गतिरोध की स्थिति का अनुकरण करें और उसके संगत गतिरोध ग्राफ़ को देखें।
इस प्रदर्शन के लिए, हमने ग्राहक और आदेश तालिका बनाई और कुछ नमूना रिकॉर्ड सम्मिलित किए।
CREATE TABLE Customer
(ID INT IDENTITY(1,1), CustomerName VARCHAR(20))
GO
CREATE TABLE Orders
(OrderID INT IDENTITY(1,1), ProductName VARCHAR(50))
GO
INSERT INTO Customer(CustomerName) VALUES ('Rajendra')
Go 100
S INSERT INTO Orders(ProductName) VALUES ('Laptop')
Go 100
फिर, हमने एक नई क्वेरी विंडो खोली और वैश्विक स्तर पर ट्रेस फ़्लैग को सक्षम किया।
डीबीसीसी ट्रेसन(1222,-1)
एक बार जब हमने डेडलॉक ट्रेस फ्लैग को सक्षम कर दिया, तो हमने दो सत्र शुरू किए और क्वेरी को नीचे के क्रम में निष्पादित किया:
- पहला सत्र ग्राहक आईडी 1 के लिए ग्राहक तालिका को अपडेट करने के लिए लेनदेन शुरू करता है।
- दूसरा सत्र ऑर्डर आईडी 10 के लिए ऑर्डर तालिका को अपडेट करने के लिए लेनदेन शुरू करता है।
- पहला सत्र उसी ऑर्डर आईडी 10 के लिए ऑर्डर तालिका को अपडेट करने का प्रयास करता है। दूसरा सत्र पहले से ही इस पंक्ति को लॉक कर देता है। सत्र 2 द्वारा आयोजित ताले के कारण सत्र 1 अवरुद्ध है।
- अब, सत्र 2 के लिए, हम ग्राहक आईडी 1 के लिए ग्राहक तालिका को अपडेट करना चाहते हैं। यह एक गतिरोध की स्थिति उत्पन्न करता है जहां सत्र आईडी 63 और आईडी 65 दोनों प्रगति नहीं कर सकते।
इस उदाहरण में, SQL सर्वर एक डेडलॉक पीड़ित (सत्र आईडी 65) को चुनता है और लेनदेन को समाप्त कर देता है। आइए system_health विस्तारित ईवेंट सत्र से गतिरोध ग्राफ़ प्राप्त करें।
SELECT XEvent.query('(event/data/value/deadlock)[1]') AS DeadlockGraph
FROM (
SELECT XEvent.query('.') AS XEvent
FROM (
SELECT CAST(target_data AS XML) AS TargetData
FROM sys.dm_xe_session_targets st
INNER JOIN sys.dm_xe_sessions s
ON s.address = st.event_session_address
WHERE s.NAME = ‘system_health’
AND st.target_name = ‘ring_buffer’
) AS Data
CROSS APPLY TargetData.nodes('RingBufferTarget/event[@name="xml_deadlock_report"]
') AS XEventData(XEvent)
) AS source;
यह क्वेरी हमें एक गतिरोध एक्सएमएल देती है जिसके लिए जानकारी की व्याख्या करने के लिए एक अनुभवी डीबीए की आवश्यकता होती है।
हम .XDL एक्सटेंशन का उपयोग करके इस गतिरोध XML को सहेजते हैं और जब हम SSMS में XDL फ़ाइल खोलते हैं, तो हमें नीचे दिखाया गया गतिरोध ग्राफ मिलता है।
यह गतिरोध ग्राफ निम्नलिखित जानकारी प्रदान करता है:
- प्रक्रिया नोड: ओवल में आपको प्रक्रिया संबंधी जानकारी मिलती है।
- संसाधन नोड: संसाधन नोड्स (स्क्वायर बॉक्स) ताले के साथ-साथ लेनदेन में शामिल वस्तुओं के बारे में जानकारी प्रदान करते हैं। इस उदाहरण में, यह RID लॉक दिखाता है क्योंकि हमारे पास दोनों तालिकाओं के लिए कोई अनुक्रमणिका नहीं है।
- किनारों: एक किनारा प्रक्रिया नोड और संसाधन नोड को जोड़ता है। यह संसाधन स्वामी को दिखाता है और लॉक मोड का अनुरोध करता है।
यह गतिरोध ग्राफ़ में अंडाकार को पार करके एक गतिरोध पीड़ित का प्रतिनिधित्व करता है।
आप निम्न तरीकों से SQL सर्वर गतिरोध जानकारी कैप्चर कर सकते हैं:
- एसक्यूएल सर्वर प्रोफाइलर
- SQL सर्वर विस्तारित ईवेंट
- SQL सर्वर त्रुटि लॉग
- SQL सर्वर में डिफ़ॉल्ट निशान
SQL सर्वर में 5 प्रकार के गतिरोध
1) लुकअप गतिरोध को बुकमार्क करें
बुकमार्क लुकअप SQL सर्वर में आमतौर पर पाया जाने वाला गतिरोध है। यह सेलेक्ट स्टेटमेंट और DML (इन्सर्ट, अपडेट और डिलीट) स्टेटमेंट के बीच विरोध के कारण होता है। आमतौर पर, SQL सर्वर डेडलॉक पीड़ित के रूप में चयन कथन को चुनता है क्योंकि यह डेटा परिवर्तन का कारण नहीं बनता है और रोलबैक त्वरित होता है। बुकमार्क लुकअप से बचने के लिए, आप कवरिंग इंडेक्स का उपयोग कर सकते हैं। आप चुनिंदा बयानों में एक NOLOCK क्वेरी संकेत का भी उपयोग कर सकते हैं, लेकिन यह अप्रतिबद्ध डेटा पढ़ता है।
2) रेंज स्कैन गतिरोध
कभी-कभी, हम सर्वर स्तर या सत्र स्तर पर एक सीरियल आइसोलेशन स्तर का उपयोग करते हैं। यह समवर्ती नियंत्रण के लिए एक प्रतिबंधात्मक अलगाव स्तर है और पृष्ठ या पंक्ति स्तर के ताले के बजाय रेंज स्कैन लॉक बना सकता है। SERIALIZABLE आइसोलेशन स्तर में, उपयोगकर्ता डेटा को संशोधित होने पर नहीं पढ़ सकते हैं, लेकिन लेन-देन में प्रतिबद्ध होने की प्रतीक्षा कर रहे हैं। इसी तरह, यदि कोई लेन-देन डेटा पढ़ता है, तो कोई अन्य लेन-देन इसे संशोधित नहीं कर सकता है। यह न्यूनतम संगामिति प्रदान करता है इसलिए हमें विशिष्ट अनुप्रयोग आवश्यकताओं में इस अलगाव स्तर का उपयोग करना चाहिए।
3) कैस्केडिंग बाधा गतिरोध
SQL सर्वर विदेशी कुंजी बाधाओं का उपयोग करके तालिकाओं के बीच अभिभावक-बाल संबंध का उपयोग करता है। इस परिदृश्य में, यदि हम पैरेंट तालिका से किसी रिकॉर्ड को अद्यतन या हटाते हैं, तो यह अनाथ रिकॉर्ड को रोकने के लिए चाइल्ड टेबल पर आवश्यक लॉक लेता है। इन गतिरोधों को खत्म करने के लिए, आपको हमेशा चाइल्ड टेबल में डेटा को पहले पैरेंट डेटा के बाद संशोधित करना चाहिए। आप DELETE CASCADE या UPDATE CASCADE विकल्पों का उपयोग करके सीधे पैरेंट टेबल के साथ भी काम कर सकते हैं। आपको विदेशी कुंजी स्तंभों पर उपयुक्त अनुक्रमणिकाएँ भी बनानी चाहिए।
4) इंट्रा-क्वेरी समानांतरवाद गतिरोध
एक बार जब कोई उपयोगकर्ता SQL क्वेरी इंजन को कोई क्वेरी सबमिट करता है, तो क्वेरी ऑप्टिमाइज़र एक अनुकूलित निष्पादन योजना बनाता है। यह क्वेरी लागत, समांतरता की अधिकतम डिग्री (MAXDOP) और समानांतरवाद के लिए लागत सीमा के आधार पर एक सीरियल या समानांतर क्रम में क्वेरी को निष्पादित कर सकता है।
समांतरता मोड में, SQL सर्वर एकाधिक थ्रेड असाइन करता है। कभी-कभी समांतरता मोड में बड़ी क्वेरी के लिए, ये थ्रेड एक दूसरे को अवरुद्ध करना शुरू कर देते हैं। आखिरकार, यह गतिरोध में परिवर्तित हो जाता है। इस मामले में, आपको निष्पादन योजना और अपने MAXDOP और समांतरता कॉन्फ़िगरेशन के लिए लागत सीमा की समीक्षा करने की आवश्यकता है। गतिरोध की स्थिति का निवारण करने के लिए आप सत्र स्तर पर MAXDOP भी निर्दिष्ट कर सकते हैं।
5) रिवर्स ऑब्जेक्ट ऑर्डर डेडलॉक
इस प्रकार के गतिरोध में, T-SQL में एक से अधिक लेन-देन वस्तुओं को एक भिन्न क्रम में एक्सेस करते हैं। यह प्रत्येक सत्र के लिए संसाधनों के बीच अवरोध का कारण बनता है और इसे गतिरोध में परिवर्तित करता है। आप हमेशा वस्तुओं को तार्किक क्रम में एक्सेस करना चाहते हैं ताकि इससे गतिरोध की स्थिति पैदा न हो।
SQL सर्वर गतिरोध से बचने और कम करने के उपयोगी तरीके
- लेन-देन को छोटा रखने की कोशिश करें; यह लंबे समय तक लेन-देन में लॉक रखने से बच जाएगा।
- एक से अधिक लेन-देन में समान तार्किक तरीके से वस्तुओं तक पहुंचें।
- गतिरोध की संभावना को कम करने के लिए एक कवरिंग इंडेक्स बनाएं।
- विदेशी कुंजी कॉलम से मिलान करने के लिए इंडेक्स बनाएं. इस तरह, आप कैस्केडिंग रेफ़रेंशियल अखंडता के कारण गतिरोध को समाप्त कर सकते हैं।
- SET DEADLOCK_PRIORITY सत्र चर का उपयोग करके गतिरोध प्राथमिकताएं निर्धारित करें। यदि आप गतिरोध प्राथमिकता निर्धारित करते हैं, तो SQL सर्वर न्यूनतम गतिरोध प्राथमिकता वाले सत्र को समाप्त कर देता है।
- ट्राइ-कैच ब्लॉक का उपयोग करके त्रुटि प्रबंधन का उपयोग करें। आप गतिरोध त्रुटि को ट्रैप कर सकते हैं और गतिरोध के शिकार होने की स्थिति में लेनदेन को फिर से चला सकते हैं।
- आइसोलेशन लेवल को रीड कमिटेड स्नैपशॉट आइसोलेशन या स्नैपशॉट आइसोलेशन में बदलें। यह SQL सर्वर लॉकिंग तंत्र को बदलता है। हालांकि, आपको अलगाव के स्तर को बदलने में सावधानी बरतनी चाहिए, क्योंकि यह अन्य प्रश्नों को नकारात्मक रूप से प्रभावित कर सकता है।
SQL सर्वर गतिरोध विचार
सत्र लॉक रखने और अन्य संसाधनों की प्रतीक्षा करने से बचने के लिए SQL सर्वर में डेडलॉक एक प्राकृतिक तंत्र है। आपको गतिरोध प्रश्नों को कैप्चर करना चाहिए और उन्हें अनुकूलित करना चाहिए ताकि वे एक दूसरे के साथ संघर्ष न करें। लॉक को थोड़े समय के लिए कैप्चर करना और उसे रिलीज़ करना महत्वपूर्ण है, ताकि अन्य प्रश्न इसका प्रभावी ढंग से उपयोग कर सकें।
SQL सर्वर गतिरोध होता है, और जब SQL सर्वर आंतरिक रूप से गतिरोध स्थितियों को संभालता है, तो आपको जब भी संभव हो उन्हें कम करने का प्रयास करना चाहिए। गतिरोध को समाप्त करने के कुछ सर्वोत्तम तरीकों में एक इंडेक्स बनाना, एप्लिकेशन कोड परिवर्तन लागू करना या डेडलॉक ग्राफ़ में संसाधनों का सावधानीपूर्वक निरीक्षण करना शामिल है। SQL गतिरोध से बचने के तरीके के बारे में अधिक युक्तियों के लिए, हमारी पोस्ट देखें:क्वेरी ट्यूनिंग के साथ SQL गतिरोध से बचना।