चयन पर विभाजन कॉलम को कैसे रोकें


10

मेरे पास SQL ​​Server 2016 में तीन क्लस्टर किए गए Columnstore Index (CCI) टेबल हैं। ये सभी CCI एक ही पार्टीशन स्कीम में हैं, जो टेनेंट आईडी पर आधारित है। हाल ही में, और असंगत रूप से, मुझे इन तालिकाओं में जुड़ने से सरल चुनिंदा बयानों पर गतिरोध मिल रहे हैं। उदाहरण क्वेरी जो गतिरोध:

SELECT  TOP 33 r.tenantid
FROM    Table_r r
        INNER JOIN Table_cm cm ON r.MyKey=cm.MyKey 
        INNER JOIN Table_pe pe ON r.MyKey=pe.MyKey 
WHERE   r.TenantId = 69
        AND pe.TenantId = 69
        AND cm.TenantId = 69

त्रुटि संदेश:

लेन-देन (प्रोसेस आईडी 56) एक अन्य प्रक्रिया के साथ जेनेरिक प्रतीक्षा योग्य वस्तु संसाधनों पर डेडलॉक किया गया था और इसे डेडलॉक पीड़ित के रूप में चुना गया है। लेन-देन फिर से करें।

सुराग:

  • यदि क्वेरी CCI के अलावा किसी अन्य इंडेक्स का उपयोग करता है तो यह गतिरोध नहीं है।
  • अगर मैं तीन में से दो टेनेंटिड फिल्टर निकालता हूं तो यह गतिरोध नहीं है।
  • यदि मैं शीर्ष 32 का चयन करता हूं या कम करता है तो यह गतिरोध नहीं है।
  • अगर मैं विकल्प (MAXDOP 1) जोड़ता हूं तो यह गतिरोध नहीं है।
  • मैं अपने तले हुए PROD प्रतिकृति, PROAD READ-ONLY द्वितीयक, और PROD में ही इसे हटा सकता हूं।
  • मैं DEV या INT में इस व्यवहार को रद्द नहीं कर सकता।
  • यह अभी भी गतिरोध है अगर मैं सभी 3 टेबल जॉइन के साथ (NOLOCK) जोड़ देता हूं
  • क्वेरी केवल गतिरोध है। यह गतिरोध तब होगा जब कोई अन्य सक्रिय प्रक्रिया नहीं होगी।
  • समानता के बिना क्वेरी योजना गतिरोध नहीं करती है

डेडलॉक xml यहाँ

हमारे PROD संस्करण:

Microsoft SQL Server 2016 (SP2-CU5) (KB4475776) - 13.0.5264.1 (X64) जनवरी 10 2019 18:51:38 कॉपीराइट (c) Microsoft कॉर्पोरेशन एंटरप्राइज़ संस्करण (64-बिट) Windows Server 2012 R2 मानक 6.3 (बिल्ड 9600 पर) :) (हाइपरविजर)

मैं इस क्वेरी पर गतिरोध कैसे रोकूं?

जवाबों:


8

चूंकि आप SQL सर्वर 2016 पर हैं, इसलिए यह उल्लेखनीय है कि कॉलमस्टोर इंडेक्स में समांतर गतिरोधों के लिए कम से कम एक सार्वजनिक बग फिक्स है:

FIX: जब आप SQL Server 2016 और 2017 में क्लस्टर किए गए कॉलमस्टोर इंडेक्स पर समानांतर क्वेरी चलाते हैं, तो गतिरोध उत्पन्न होता है

( शुरुआत में लिंक प्रदान करने के लिए डेनिस रूबास्किन का धन्यवाद )

यह SP1 CU7 के भाग के रूप में जारी किया गया था। यदि आप उस CU तक नहीं हैं, तो आपको वह शॉट देना चाहिए। यह फिक्स SP2 (किसी भी CU) में शामिल किया जाएगा।

सामान्य तौर पर, अंतर-क्वेरी समानतावाद गतिरोधों को ठीक करने के लिए दो दृष्टिकोण:

  • समानता से बचें (क्वेरी को ट्यून करके ताकि यह समानांतर न जाए, एक MAXDOPसंकेत का उपयोग करके , आदि) - यह थॉमस कॉस्टर द्वारा दूसरे उत्तर में कवर किया गया है
  • SQL सर्वर के लिए नवीनतम सर्विस पैक / संचयी अद्यतन लागू करें

2

क्या आपने इंट्रा-क्वेरी समानांतर थ्रेड डेडलॉक पर ब्लॉग का अनुसरण किया है

SyncPointअगर मैं भूल नहीं कर रहा हूँ संसाधन एक मुद्रा घटना के उपयोग को दर्शाता है।
अपने गतिरोध के प्रतिभागियों को देखकर आप देख सकते हैं कि वे सभी एक ही स्पिड (55) और बैच (0) से आ रहे हैं, लेकिन विभिन्न थ्रेड्स का उपयोग कर रहे हैं। यह इंगित करता है कि वे सभी समान समानांतर क्वेरी का हिस्सा हैं और इस तथ्य से पुष्टि की जाती है कि जब भी आप क्वेरी चलाते हैं तो आपको कोई गतिरोध प्राप्त नहीं होता है MAXDOP 1। इंट्रा-क्वेरी समानांतर थ्रेड डेडलॉक के मामले में, एक एकल क्वेरी के थ्रेड्स आपके मामले में सिंक्रोनाइज़ेशन ऑब्जेक्ट्स, सिंकपॉइंट्स की प्रतीक्षा में एक-दूसरे को गतिरोध समाप्त कर देंगे।

पिछली बार जब मैंने इस तरह का व्यवहार देखा था, तो मैं क्वेरी को और अधिक अनुकूलित करने में सक्षम था और इस तरह क्वेरी को समानांतर निष्पादन योजना का उपयोग करने से रोक रहा था। मुझे संदेह है कि आपने अपने परिणाम को 32 रिकॉर्ड तक सीमित करके या एक अलग सूचकांक का उपयोग करके एक ही काम किया।
एक अन्य विकल्प MAXDOP 1आपकी क्वेरी में जोड़ना होगा , हालांकि इस विकल्प का बहुत बड़ा प्रशंसक नहीं है।

लेकिन उन दो विकल्पों के साथ इधर-उधर होने से पहले, जाँच लें कि क्या आप नवीनतम SP / CU पर हैं।

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