क्वेरी एकल चयन है जिसमें बहुत सारे समूहीकरण स्तर और एग्रीगेट संचालन शामिल हैं। SET ARITHABORT ON के साथ एक सेकंड से भी कम समय लगता है, अन्यथा इसमें कई मिनट लगते हैं। हमने SQL Server 2000 और 2008 पर इस व्यवहार को देखा है।
क्वेरी एकल चयन है जिसमें बहुत सारे समूहीकरण स्तर और एग्रीगेट संचालन शामिल हैं। SET ARITHABORT ON के साथ एक सेकंड से भी कम समय लगता है, अन्यथा इसमें कई मिनट लगते हैं। हमने SQL Server 2000 और 2008 पर इस व्यवहार को देखा है।
जवाबों:
थोड़ा दिनांकित, लेकिन किसी को भी इसी तरह की समस्या के साथ यहाँ समाप्त होने के लिए ...
मुझे भी यही समस्या थी। मेरे लिए यह सूँघने का पैरामीटर था, जिसके बारे में मुझे पहले से ध्यान नहीं था। मैंने एक 'सेट आर्किटबॉर्ट ऑन' जोड़ा, जिसने समस्या को ठीक किया लेकिन फिर यह वापस आ गया। फिर मैंने पढ़ा:
http://www.sommarskog.se/query-plan-mysteries.html
इसने साफ किया कि -सब कुछ। चूँकि मैं एसक्यूएल के लिए लाइनक का उपयोग कर रहा था और समस्या को ठीक करने के लिए सीमित विकल्प थे, मैंने क्वेरी योजना को मजबूर करने के लिए एक क्वेरी प्लान गाइड (लिंक का अंत देखें) का उपयोग किया।
.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 ।
SET
विकल्प को बदलना बहुत आसान होगा, एक बेहतर योजना प्राप्त करें और यह गलत होने पर विकल्प के रूप में गलत है। मुझे विश्वास नहीं हो रहा है कि आपके लिंक के लड़के ने ऐसा नहीं किया है।
मेरा तर्क है कि यह लगभग निश्चित रूप से पैरामीटर सूँघ रहा था।
यह अक्सर कहा जाता है कि 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
सेट की आवश्यकता होती है ।
मुझे पता है कि मुझे इस पार्टी में देर हो रही है, लेकिन भविष्य के आगंतुकों के लिए, मार्टिन बिल्कुल सही है। हम इसी मुद्दे में भाग गए - एक 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 स्वयं क्वेरी ऑप्टिमाइज़ेशन पर नकारात्मक प्रभाव डाल सकता है, हमारा परीक्षण इस बात की पुष्टि करता है कि मार्टिन सही है - इसका कारण पैरामीटर सूँघना था और परिणामस्वरूप योजना सभी श्रेणियों के मापदंडों के लिए इष्टतम नहीं थी।
Setting ARITHABORT to OFF can negatively impact query optimization leading to performance issues.
का क्या अर्थ है। चाहे वे सिर्फ गणना किए गए स्तंभों और दृश्यों (यदि ANSI_WARNINGS
यह भी बंद है) पर अनुक्रमित का उपयोग करने में असमर्थता के बारे में बात कर रहे हैं या यदि यह वास्तव में कुछ महत्वपूर्ण प्रभाव है।
बस यह समस्या थी। जैसा कि लोगों ने यहां कहा, मूल कारण कई क्वेरी योजनाएं हैं, जिनमें से एक उप-इष्टतम है। मैं सिर्फ यह सत्यापित करना चाहता था कि ARITHABORT वास्तव में समस्या का कारण बन सकता है (क्योंकि क्वेरी में मुझे कोई समस्या नहीं थी जिसमें कोई पैरामीटर नहीं था, जो पैरामीटर को समीकरण से सूँघने में लेता है)।
यह मुझे ठीक उसी समस्या की याद दिलाता है जिसे मैंने 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 परमिशन के लिए निम्नलिखित आवश्यकताएं मौजूद हैं ताकि कमांड चलाने के लिए पर्याप्त हो:
इस समस्या को सत्यापित करने के लिए, हमें केवल लिंक किए गए सर्वर साइड उदाहरण पर प्रोफाइलर को चलाने की आवश्यकता है और नीचे दिखाए गए अनुसार "त्रुटियां और चेतावनी" अनुभाग में कुछ घटनाओं को चालू करना होगा।
उम्मीद है कि यह अनुभव समुदाय को किसी तरह मदद कर सकता है।