नाटकीय रूप से एक क्वेरी को गति प्रदान करने पर ARITHABORT क्यों सेट किया जाएगा?


74

क्वेरी एकल चयन है जिसमें बहुत सारे समूहीकरण स्तर और एग्रीगेट संचालन शामिल हैं। SET ARITHABORT ON के साथ एक सेकंड से भी कम समय लगता है, अन्यथा इसमें कई मिनट लगते हैं। हमने SQL Server 2000 और 2008 पर इस व्यवहार को देखा है।

जवाबों:


62

थोड़ा दिनांकित, लेकिन किसी को भी इसी तरह की समस्या के साथ यहाँ समाप्त होने के लिए ...

मुझे भी यही समस्या थी। मेरे लिए यह सूँघने का पैरामीटर था, जिसके बारे में मुझे पहले से ध्यान नहीं था। मैंने एक 'सेट आर्किटबॉर्ट ऑन' जोड़ा, जिसने समस्या को ठीक किया लेकिन फिर यह वापस आ गया। फिर मैंने पढ़ा:

http://www.sommarskog.se/query-plan-mysteries.html

इसने साफ किया कि -सब कुछ। चूँकि मैं एसक्यूएल के लिए लाइनक का उपयोग कर रहा था और समस्या को ठीक करने के लिए सीमित विकल्प थे, मैंने क्वेरी योजना को मजबूर करने के लिए एक क्वेरी प्लान गाइड (लिंक का अंत देखें) का उपयोग किया।


3
छह साल से अधिक समय बाद, इस उत्तर में दिया गया लिंक अभी भी "आवश्यक पढ़ना" है ... और अभी भी वर्तमान है, नवीनतम संशोधन दिसंबर '17।
टकेरेल

30

.NET अनुप्रयोग डिफ़ॉल्ट रूप से अक्षम विकल्प से जुड़ते हैं, लेकिन यह प्रबंधन स्टूडियो में डिफ़ॉल्ट रूप से सक्षम होता है। परिणाम यह है कि सर्वर वास्तव में अधिकांश / सभी प्रक्रियाओं के लिए 2 अलग-अलग निष्पादन योजनाओं को कैश करता है। यह प्रभावित करता है कि सर्वर संख्यात्मक गणना कैसे करता है और इस तरह आप प्रक्रिया के आधार पर बेतहाशा अलग परिणाम प्राप्त कर सकते हैं। यह वास्तव में केवल 2 सामान्य तरीकों में से एक है जो एक खरीद को एक भयानक निष्पादन योजना प्राप्त कर सकता है, दूसरा पैरामीटर सूँघ रहा है।

Https://web.archive.org/web/20150315031719/http://sqladvice.com/blogs/gstark/archive/2008/02/12/Arithabort-Option-Effects-Stored-Procedure-Performance पर एक नज़र डालें इस पर थोड़ी और चर्चा के लिए aspx


मैं इसके आधे उत्तर से सहमत हूं। यद्यपि संख्यात्मक गणना के दावे के बारे में बहुत संदेह है!
मार्टिन स्मिथ

2
@Martin: मुझे लगता है कि मैं अस्पष्ट था। मैं सिर्फ यह कह रहा था कि SQL सर्वर किसी भी div / 0 या अंकगणितीय अतिप्रवाह त्रुटि पर त्रुटि करेगा। जब यह बंद होता है तो यह चलता रहता है और जो भी कारण से सभी प्रकार की भयानक समस्याओं का कारण बन सकता है।

@ - हाँ, मुझे खेद है कि मैं विशेष रूप से आपके जवाब पर हमला नहीं करना चाहता था, मैं सिर्फ इशारा कर रहा था कि एक SETविकल्प को बदलना बहुत आसान होगा, एक बेहतर योजना प्राप्त करें और यह गलत होने पर विकल्प के रूप में गलत है। मुझे विश्वास नहीं हो रहा है कि आपके लिंक के लड़के ने ऐसा नहीं किया है।
मार्टिन स्मिथ

@ मार्टिन - कोई समस्या नहीं है, मुझे नहीं लगा कि आप मुझ पर हमला कर रहे हैं। मैंने जो दूसरी चर्चा की, वह थोड़ी अस्पष्ट हो सकती है। मैं सिर्फ समर्थन साक्ष्य देने की कोशिश कर रहा था।

@ मार्टिन प्रतिशोध में मेरा मानना ​​है कि आप सही हैं।

21

मेरा तर्क है कि यह लगभग निश्चित रूप से पैरामीटर सूँघ रहा था।

यह अक्सर कहा जाता है कि SET OPTIONSइस तरह से प्रदर्शन को प्रभावित किया जा सकता है, लेकिन मुझे अभी तक इस दावे के लिए एक एकल आधिकारिक स्रोत को देखना है, केवल उस मामले को छोड़कर जहां आप अनुक्रमित दृश्य / निरंतर गणना किए गए कॉलम का उपयोग कर रहे हैं।

इस स्थिति में (SQL2005 + के लिए और जब तक कि आपका डेटाबेस SQL2000 संगतता मोड में न हो )। यदि आपके पास दोनों हैं ARITHABORTऔर ANSI_WARNINGS OFFफिर आप पाएंगे कि इंडेक्स का उपयोग नहीं किया जा रहा है, तो वांछित शोध के बजाय एक स्कैन हो सकता है (और कुछ ओवरहेड के रूप में स्थायी गणना परिणाम का उपयोग नहीं किया जा सकता है)। ADO.NET ANSI_WARNINGS ONएक त्वरित परीक्षण से होने के लिए डिफ़ॉल्ट रूप से लगता है जो मैंने अभी किया था।

बेन के जवाब में दावा है कि "जिस तरह से सर्वर संख्यात्मक गणना करता है" परिणाम को मिनट जोड़ सकता है जो अन्यथा एक सेकंड से भी कम समय लेगा बस मुझे विश्वसनीय नहीं लगता है। मुझे लगता है कि जो कुछ भी होता है वह यह है कि एक प्रदर्शन प्रदर्शन समस्या की जांच करने पर Profiler का उपयोग अपमानजनक क्वेरी की पहचान करने के लिए किया जाता है। यह प्रबंधन स्टूडियो में चलाया जाता है और तुरंत परिणाम देता है। कनेक्शन के बीच एकमात्र स्पष्ट अंतर ARITH_ABORTविकल्प है।

एक प्रबंधन स्टूडियो विंडो में एक त्वरित परीक्षण से पता चलता है कि कब SET ARITHABORT OFFचालू होता है और क्वेरी को चलाया जाता है कि प्रदर्शन समस्या फिर से आती है ताकि स्पष्ट रूप से मामला बंद हो जाए। वास्तव में यह ग्रीग स्टार्क लिंक में उपयोग की जाने वाली समस्या निवारण पद्धति प्रतीत होती है ।

हालाँकि यह इस तथ्य को नजरअंदाज करता है कि उस विकल्प के साथ आप कैश से ठीक उसी तरह की खराब योजना प्राप्त कर सकते हैं

यदि आप एप्लिकेशन कनेक्शन के उपयोग से भिन्न उपयोगकर्ता के रूप में लॉग इन हैं तो भी यह योजना का पुन: उपयोग हो सकता है।

मैंने इसे एक परीक्षण क्वेरी को पहले वेब एप्लिकेशन से SET ARITHABORT OFFऔर फिर प्रबंधन स्टूडियो से निष्पादित करके देखा और नीचे दिए गए क्वेरी से ऊपर जा रहा है।

SELECT usecounts, cacheobjtype, objtype, text ,query_plan
FROM sys.dm_exec_cached_plans 
CROSS APPLY sys.dm_exec_sql_text(plan_handle) 
CROSS APPLY sys.dm_exec_query_plan(plan_handle) 

इस शेयरिंग pf प्लान के लिए वास्तव में सभी प्लान कैश कीज के समान होने चाहिए। arithabortस्वयं के साथ-साथ कुछ अन्य उदाहरण हैं निष्पादन करने वाले उपयोगकर्ताओं को उसी डिफ़ॉल्ट स्कीमा की आवश्यकता होती है (यदि क्वेरी निहित नाम रिज़ॉल्यूशन पर निर्भर करती है) और कनेक्शन को समान languageसेट की आवश्यकता होती है ।

योजना कैश कुंजियों की एक पूरी सूची यहाँ


12

मुझे पता है कि मुझे इस पार्टी में देर हो रही है, लेकिन भविष्य के आगंतुकों के लिए, मार्टिन बिल्कुल सही है। हम इसी मुद्दे में भाग गए - एक SP .NET क्लाइंट के लिए बहुत धीमी गति से चल रहा था, जबकि यह SSMS के लिए तेजी से धधक रहा था। इस मुद्दे की खोज और हल करने में, हमने व्यवस्थित परीक्षण किया जो केनी एविट ने मार्टिन के प्रश्न के बारे में अपनी टिप्पणी में पूछा।

मार्टिन की क्वेरी के एक संस्करण का उपयोग करते हुए, मैंने प्रक्रिया कैश में सपा की तलाश की और उनमें से दो को पाया। योजनाओं को देखते हुए, यह वास्तव में ऐसा था कि किसी के पास ARITHABORT ON था और किसी के पास ARITHABORT OFF था। ARITHABORT OFF संस्करण में एक सूचकांक की तलाश थी, जबकि ARITHABORT ON संस्करण ने उसी आउटपुट के लिए एक इंडेक्स स्कैन का उपयोग किया था। शामिल किए गए मापदंडों को देखते हुए, सूचकांक की तलाश में आउटपुट के लिए दसियों लाख रिकॉर्ड की आवश्यकता होती है।

मैंने कैश से दो प्रक्रियाओं को मंजूरी दे दी थी और .NET क्लाइंट ने SP को फिर से चलाया था, उसी मापदंडों का उपयोग करके (जिसमें बहुत सारी गतिविधि वाले ग्राहक के लिए एक विस्तृत तिथि सीमा थी)। एसपी तुरंत लौट आए। कैश्ड प्लान ने उसी इंडेक्स स्कैन का इस्तेमाल किया, जो पहले ARITHABORT ON प्लान में दिखाया गया था - लेकिन इस बार का प्लान ARITHABORT OFF के लिए था। हमने एसएसएमएस में समान मापदंडों के साथ एसपी को दौड़ाया, और फिर तुरंत परिणाम मिले। अब हमने देखा कि एक दूसरे प्लान को कैश किया गया, जिसमें ARITHABORT ON, इंडेक्स स्कैन के साथ था।

हमने तब कैश को साफ किया, एसपीएमएस में एक संकीर्ण तारीख सीमा के साथ एसपी को दौड़ाया और तत्काल परिणाम मिला। हमने पाया कि परिणामी कैश्ड प्लान में एक इंडेक्स की तलाश थी, क्योंकि उसी आउटपुट को पहले एक स्कैन के साथ संभाला गया था (जो कि ARITHABORT OFF के साथ मूल प्लान में भी था)। SSMS से फिर, हमने एसपी को दौड़ाया, इस बार उसी दिनांक सीमा के साथ, और हमने मूल .NET अनुरोध में वही भयानक प्रदर्शन देखा।

संक्षेप में, असमानता का ARITHABORT के वास्तविक मूल्य से कोई लेना-देना नहीं था - इसके साथ या बंद होने पर, या तो क्लाइंट से, हम स्वीकार्य या भयानक प्रदर्शन प्राप्त कर सकते थे: जो कुछ भी मायने रखता था वह योजना को संकलित करने और कैशिंग में उपयोग किए जाने वाले पैरामीटर मान थे।

जबकि MSDN इंगित करता है कि ARITHABORT OFF स्वयं क्वेरी ऑप्टिमाइज़ेशन पर नकारात्मक प्रभाव डाल सकता है, हमारा परीक्षण इस बात की पुष्टि करता है कि मार्टिन सही है - इसका कारण पैरामीटर सूँघना था और परिणामस्वरूप योजना सभी श्रेणियों के मापदंडों के लिए इष्टतम नहीं थी।


1
आश्चर्य है कि उस वाक्यांश Setting ARITHABORT to OFF can negatively impact query optimization leading to performance issues.का क्या अर्थ है। चाहे वे सिर्फ गणना किए गए स्तंभों और दृश्यों (यदि ANSI_WARNINGSयह भी बंद है) पर अनुक्रमित का उपयोग करने में असमर्थता के बारे में बात कर रहे हैं या यदि यह वास्तव में कुछ महत्वपूर्ण प्रभाव है।
मार्टिन स्मिथ

मुझे यकीन नहीं है। मुझे आश्चर्य है कि अगर बस यही स्थिति है कि MSDN में कोई व्यक्ति ऐसी ही स्थिति में चला गया, तो ARTIHABORT को ON पर सेट करें, प्रदर्शन में सुधार देखा, और उसी निष्कर्ष पर पहुंचा जो दूसरों के पास है। जहाँ तक अनुक्रमित विचारों और संगणित स्तंभों की बात है, मैं अस्पष्ट हूँ। एक बिंदु पर यह बताता है कि यदि INSERT, UPDATE, या DELETE ऑपरेशन में संग्रहीत डेटा मानों को संशोधित करता है, तो SET विकल्पों में विशिष्ट मान होना चाहिए। कहीं और वे कहते हैं कि ऑप्टिमाइज़र "किसी भी क्वेरी" के लिए अनुक्रमित को अनदेखा करेगा जो संदर्भों ने अनुक्रमित दृश्य या गणना किए गए कॉलम को कहा। क्या दोनों सच हैं, या यह वास्तव में "डेटा को संशोधित करने वाला कोई प्रश्न है"?
mdoyle

1

बस यह समस्या थी। जैसा कि लोगों ने यहां कहा, मूल कारण कई क्वेरी योजनाएं हैं, जिनमें से एक उप-इष्टतम है। मैं सिर्फ यह सत्यापित करना चाहता था कि ARITHABORT वास्तव में समस्या का कारण बन सकता है (क्योंकि क्वेरी में मुझे कोई समस्या नहीं थी जिसमें कोई पैरामीटर नहीं था, जो पैरामीटर को समीकरण से सूँघने में लेता है)।


1

यह मुझे ठीक उसी समस्या की याद दिलाता है जिसे मैंने sql सर्वर 2008 दिनों में अनुभव किया था। हमारे मामले में, हमें अचानक एक sql नौकरी मिल गई जो अचानक धीमी हो गई (आमतौर पर कुछ सेकंड, और अब 9+ मिनट), नौकरी को एक लिंक किए गए सर्वर तक पहुंचने की आवश्यकता है, हमने नौकरी के चरण में ARITHABORT को जोड़ा, और यह समस्या लग रही थी कुछ दिनों के लिए हल किया गया था और फिर लौट आया।

हमने बाद में एमएस समर्थन के साथ एक टिकट खोला, और शुरू में वे या तो पता नहीं लगा सके, और टिकट को एक बहुत ही वरिष्ठ PFE टीम में बढ़ाया गया, और दो समर्थन PFE ने इस मुद्दे का पता लगाने की कोशिश की।

अंतिम कारण यह है कि उपयोगकर्ता क्रेडेंशियल (कार्य चरण को चलाने के लिए) अंतर्निहित तालिकाओं (लिंक सर्वर साइड पर) के आंकड़ों तक नहीं पहुंच सकता है, और इस तरह निष्पादन योजना अनुकूलित नहीं है।

विस्तार से, उपयोगकर्ता के पास DBCC SHOW_STATISTICS पर अनुमति नहीं है (हालांकि उपयोगकर्ता तालिका से चयन कर सकता है)। MSDN के अनुसार , यह अनुमति नियम sql 2012 SP1 के बाद बदल दिया गया है

SQL सर्वर और SQL डेटाबेस के लिए अनुमतियाँ

सांख्यिकी ऑब्जेक्ट को देखने के लिए, उपयोगकर्ता के पास तालिका होनी चाहिए या उपयोगकर्ता को sysadmin निश्चित सर्वर भूमिका, db_owner निश्चित डेटाबेस भूमिका या db_ddladmin निश्चित डेटाबेस भूमिका का सदस्य होना चाहिए।

SQL सर्वर 2012 SP1 अनुमति प्रतिबंधों को संशोधित करता है और उपयोगकर्ताओं को इस आदेश का उपयोग करने की अनुमति के साथ अनुमति देता है। ध्यान दें कि SELECT परमिशन के लिए निम्नलिखित आवश्यकताएं मौजूद हैं ताकि कमांड चलाने के लिए पर्याप्त हो:

इस समस्या को सत्यापित करने के लिए, हमें केवल लिंक किए गए सर्वर साइड उदाहरण पर प्रोफाइलर को चलाने की आवश्यकता है और नीचे दिखाए गए अनुसार "त्रुटियां और चेतावनी" अनुभाग में कुछ घटनाओं को चालू करना होगा।

यहाँ छवि विवरण दर्ज करें

उम्मीद है कि यह अनुभव समुदाय को किसी तरह मदद कर सकता है।

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