SQL सर्वर में सभी कनेक्शन के लिए ARITHABORT ON सेट करने के क्या प्रभाव हैं?


10

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

विषय के बारे में एरलैंड सोमरसकॉग के शानदार लेख में, वह मूल रूप SET ARITHABORT ONसे कनेक्शन के लिए जारी करने के लिए ऐप को बदलकर सुरक्षित दृष्टिकोण लेने का सुझाव देता है । हालाँकि, dba.stackexchange प्रश्न के इस उत्तर में , सोलोमन रुट्ज़की ने एक उदाहरण-व्यापक और डेटाबेस-विस्तृत दृष्टिकोण दोनों प्रदान किया है।

इस उदाहरण को विस्तृत करने के साथ मैं यहाँ क्या अनुपस्थितियाँ याद कर रहा हूँ? जैसा कि मैंने इसे देखा है ... चूंकि एसएसएमएस में ONडिफ़ॉल्ट रूप से यह सेट है, इसलिए मुझे ONसभी कनेक्शनों के लिए इस सर्वर-वाइड को सेट करने में कोई नुकसान नहीं है । दिन के अंत में, मुझे बस इस SQL ​​सर्वर की आवश्यकता है और सब से ऊपर प्रदर्शन करने के लिए।


मेरे बहुत से उत्तर को पढ़ना जो आपने प्रश्न में लिंक किया था, अब ऐसा लगता है कि यह डिफ़ॉल्ट रूप से OFF है, कुछ क्लाइंट इसे विशेष रूप से चालू करते हैं, लेकिन EF / SqlClient इसे स्पर्श नहीं करते हैं, जिसका अर्थ है कि यह OFF के रूप में रहता है।
सोलोमन रटज़की

1
कोई ईएफ नहीं, लेकिन आप एक दिलचस्प बिंदु उठाते हैं कि ईएफ उदाहरण-व्यापी सेटिंग को कैसे ओवरराइड कर सकता है। इसलिए, यदि कोई कनेक्शन इसे ओवरराइड कर सकता है, तो जाहिर है कि इस सेट का सबसे विश्वसनीय स्थान कनेक्शन के भीतर से है जो SQL सर्वर में स्थापित है, यदि संभव हो तो ...
एरिक स्विगगम

1
"हमेशा अपने लॉगऑन सत्रों में ARITHABORT को चालू करने के लिए सेट करें। ARITHABORT को बंद करने से क्वेरी ऑप्टिमाइज़ेशन को नकारात्मक रूप से प्रभावित किया जा सकता है, जिससे प्रदर्शन समस्याएं हो सकती हैं।" Microsoft का यह लेख कहता है: docs.microsoft.com/en-us/sql/t-sql/statements/…
शिवांगिनी शिशुलकर

मैंने विभिन्न परिदृश्यों का परीक्षण किया है, सभी से मेरा अंतिम लेना यह है कि यह सेटिंग और पैरामीटर सूँघना बेडफ़्लो है। अगर आपके पास है ARITHABORT OFF, तो ठीक है। आने वाले सभी कनेक्शनों के लिए इसे बंद रखें। (गुड लक कंट्रोलिंग दैट)। लेकिन जब कोई कनेक्शन चालू होता है, तो SQL एक नया क्वेरी प्लान बनाता है और इससे प्रदर्शन प्रभावित हो सकता है। मेरे ले, इसे उदाहरण के स्तर पर डिफ़ॉल्ट उपयोगकर्ता विकल्प के रूप में सेट करें और तदनुसार प्रश्नों को ट्यून करें।
एरिक स्विगगम

जवाबों:


11

कुछ चूक हैं जो केवल इसलिए मौजूद हैं क्योंकि कोई भी वास्तव में नहीं जानता कि उन्हें बदलने का क्या प्रभाव होगा। उदाहरण के लिए, ओएस भाषा के रूप में "यूएस इंग्लिश" का उपयोग करने वाले सिस्टम पर इंस्टॉल करते समय डिफ़ॉल्ट इंस्टेंस-स्तर का टकराव होता है SQL_Latin1_General_CP1_CI_AS। इससे कोई मतलब नहीं है क्योंकि SQL_*टकराव पूर्व SQL Server 2000 संगतता के लिए हैं। SQL सर्वर 2000 में शुरू करने से आप वास्तव में एक विंडोज कोलाजेशन चुन सकते हैं, और इसलिए यूएस इंग्लिश सिस्टम के लिए डिफ़ॉल्ट को बदलना चाहिए था Latin1_General_CI_AS। लेकिन, मुझे लगता है कि Microsoft में कोई भी वास्तव में नहीं जानता कि सभी संभावित उप-प्रणालियों और सिस्टम संग्रहीत प्रक्रियाओं, आदि पर क्या प्रभाव पड़ेगा।

इसलिए, मुझे डेटाबेस डिफ़ॉल्ट या यहां तक ​​कि उदाहरण के रूप में इसे चालू करने के किसी भी विशिष्ट नकारात्मक प्रभाव के बारे में पता नहीं है। उसी समय, मैंने इसका परीक्षण नहीं किया है। लेकिन यहां तक ​​कि अगर मैंने इसका परीक्षण किया था, तो मैं अभी भी आपके आवेदन के समान कोड पथ का उपयोग नहीं कर सकता हूं, इसलिए यह कुछ ऐसा है जिसे आपको वास्तव में अपने वातावरण में परीक्षण करने की आवश्यकता है। इसे सेट करेंONअपने देव और क्यूए वातावरण में उदाहरण के स्तर पर और देखें कि यह एक या दो महीने तक कैसे काम करता है। फिर इसे स्टेजिंग / यूएटी में सक्षम करें। यदि सबकुछ कई हफ्तों तक जारी रहता है, तो उत्पादन में परिवर्तन को कॉन्फ़िगर करें। कुंजी विभिन्न कोड रास्तों के परीक्षण के लिए जितना संभव हो उतना समय देना है जो दैनिक हिट नहीं हैं। कुछ साप्ताहिक या महीने या सालाना हिट होते हैं। कुछ कोड पथ केवल समर्थन से हिट होते हैं, या कुछ तदर्थ रिपोर्ट या रखरखाव खरीदता है जो किसी ने सालों पहले बनाया था और कभी भी आपको इसके बारे में नहीं बताया और केवल यादृच्छिक अंतराल (nah) पर उपयोग किया जाता है, ऐसा कभी नहीं होता ;-)।

इसलिए, मैंने कुछ ऐसे उदाहरणों पर परीक्षण किया, जिनमें अभी भी डिफ़ॉल्ट "उपयोगकर्ता विकल्प" सेटिंग है क्योंकि मैंने इसे कभी नहीं बदला है।

कृपया ध्यान दें:

  • @@OPTIONS/ 'user options'एक बिटमास्क मूल्य है
  • 64 के लिए थोड़ा है ARITHABORT ON

सेट अप

मैंने SQLCMD (जो ODBC का उपयोग करता है) और LINQPad (जो .NET SqlClient का उपयोग करता है) दोनों के साथ परीक्षण किया:

SQLCMD -W -S (local) ^
-Q"SELECT CONCAT(DB_NAME(), N': ', @@OPTIONS & 64, N' (', ses.[client_interface_name], N')') FROM sys.dm_exec_sessions ses WHERE ses.[session_id] = @@SPID;"
echo .

( ^DOS लाइन निरंतरता वर्ण है, .अंतिम पंक्ति पर अतिरिक्त लाइन को कॉपी-पेस्ट करना आसान बनाने के लिए बाध्य करना है)

LINQPad में:

using (SqlConnection connection =
    new SqlConnection(@"Server=(local);Trusted_Connection=true;Database=tempdb;"))
{
  using (SqlCommand command = connection.CreateCommand())
  {
    command.CommandText = @"SELECT @RetVal =
CONCAT(DB_NAME(), N': ', @@OPTIONS & 64, N' (', ses.[client_interface_name], N')')
FROM  sys.dm_exec_sessions ses
WHERE ses.[session_id] = @@SPID;";
    SqlParameter paramRetVal = new SqlParameter("@RetVal", SqlDbType.NVarChar, 500);
    paramRetVal.Direction = ParameterDirection.Output;
    command.Parameters.Add(paramRetVal);

    connection.Open();
    command.ExecuteNonQuery();

    Console.WriteLine(paramRetVal.Value.ToString());
  }
}

परीक्षण 1: पहले

SQLCMD रिटर्न:

master: 0 (ODBC)

LINQPad रिटर्न:

tempdb: 0 (.Net SqlClient Data Provider)

परिवर्तन प्रभाव कनेक्शन विकल्प:

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

DECLARE @UserOptions INT;

-- Get current bitmasked value and ensure ARITHABORT is enabled:
SELECT @UserOptions = CONVERT(INT, cnf.[value_in_use]) | 64 -- enable "ARITHABORT"
FROM   sys.configurations cnf
WHERE  cnf.[configuration_id] = 1534 -- user options

-- Apply new default connection options:
EXEC sys.sp_configure N'user options', @UserOptions;
RECONFIGURE;

परीक्षण 2: के बाद

SQLCMD रिटर्न:

master: 64 (ODBC)

LINQPad रिटर्न:

tempdb: 64 (.Net SqlClient Data Provider)

निष्कर्ष

मान लीजिये:

  1. होने का कोई लाभ प्रतीत नहीं होता ARITHABORT OFF
  2. होने का लाभ है ARITHABORT ON
  3. डिफ़ॉल्ट कनेक्शन सेटिंग (जब तक कनेक्शन द्वारा ओवरराइड नहीं किया जाता है) = OFF
  4. ऐसा प्रतीत नहीं होता है कि ODBC या OLEDB / .NET SqlClient सेट करने का प्रयास करता है ARITHABORT, इस प्रकार वे डिफ़ॉल्ट सेटिंग को स्वीकार करते हैं

मेरा सुझाव है कि इंस्टेंस-वाइड डिफॉल्ट कनेक्शन विकल्पों को बदलना (जैसा कि ऊपर दिखाया गया है)। यह एप्लिकेशन को अपडेट करने की तुलना में कम अप्रिय होगा। अगर आपको इंस्टेंस-वाइड सेटिंग बदलने में कोई समस्या आती है तो मैं केवल ऐप को अपडेट करूंगा ।

PS मैंने इंस्टेंस-वाइड सेटिंग को बदलने tempdbऔर बदलने के साथ एक सरल परीक्षण किया और यह काम नहीं किया।


1
हुह, इस विषय पर पॉल व्हाइट के साथ इस प्रश्नोत्तर को पढ़ने के बाद, यह प्रतीत होता है कि सेट पर ANSI_WARNINGS गुजरने पर, ARITHABORT को चालू करता है। फिर भी, अगर SET ARITHABORT OFF को कनेक्शन में भी पास कर दिया जाता है, तो भी ANSI_WARNINGS इसे ओवरराइड करने के साथ, SQL सर्वर अभी भी "कार्य" करेगा जैसे ARITHABORT बंद है, जैसा कि अजीब योजनाओं को चुनने में है। मुझे यह मिल गया ... मन-मुटाव। तो एक शक के बिना, यह कनेक्शन में सेट करने की जरूरत है और सेट आउट बंद भी मौजूद नहीं हो सकता। मेरी नज़रों में बंद मामला ... sqlservercentral.com/forums/topic/…
एरिक स्विग्गाम

@EricSwiggum दिलचस्प धागा आपको मिला। हालाँकि, मैं नहीं देखता कि आप उस जानकारी से कैसे निष्कर्ष निकालते हैं कि इसे कनेक्शन में सेट करने की आवश्यकता है। यदि वर्तमान में कुछ भी इसे ओवरराइड नहीं कर रहा है, तो हम जानते हैं कि SET ARITHABORT OFFमौजूद नहीं है । तो इसके मौजूद होने की चिंता क्यों? एकमात्र उदाहरण हमने देखा है कि जहां डिफ़ॉल्ट ओवरराइड किया गया है, SSMS इसे सेट कर रहा है ON(जो कि एक अच्छी बात है)। किसी भी तरह से, मैंने अपने उत्तर को परीक्षण के साथ अद्यतन किया है और जो मैं सबसे तार्किक सिफारिश (मौजूदा जानकारी के अनुसार) के रूप में देखता हूं।
सोलोमन रटज़की

1
मैं सहमत हूं, उदाहरण के रूप में इंस्टेंस-वाइड सेटिंग को सक्षम करें। लेकिन अंततः कनेक्शन नियंत्रित करता है कि क्या सेट है। साझा उदाहरणों के मामले के बारे में जहां विभिन्न प्रौद्योगिकियां / प्रोटोकॉल एसक्यूएल से जुड़ रहे हैं? मेरा मतलब है, क्या मुझे पागल आदमी की तरह विकास करने के लिए इधर-उधर भागना पड़ता है और "SET ARITHABORT ON" चिल्लाना पड़ता है? या बहुत कम से कम, यदि संभव हो तो ARITHABORT OFF की अनुपस्थिति को बढ़ावा दें। मुझे यह भी अजीब लगता है कि मैंने इसे अब तक एक सिर पर नहीं देखा है, मेरे 6 साल पूरे समय के डीबीए के रूप में। या हो सकता है कि यह एक ऐसा मामला है जहाँ मैंने इसे बहुत मुश्किल से नहीं देखा है। मुझे वापस पॉल या एर्लैंड, LOL, इसके साथ क्या हो रहा है?
एरिक स्विग्म

@EricSwiggum 1) यदि आप उदाहरण स्तर के डिफ़ॉल्ट को बदलते हैं, तो आपको कुछ भी चिल्लाते हुए दौड़ने की आवश्यकता नहीं होगी। 2) आपको इसकी अनुपस्थिति को बढ़ावा देने की आवश्यकता होगी ARITHABORT OFF यदि आपको इसका कोई वास्तविक प्रमाण मिल जाए। अब तक संभावना नहीं है। 3) चूंकि यह क्वेरी योजनाओं को प्रभावित करता है, इसलिए यह हो सकता है कि टेबल सर्वर के पास कभी भी पर्याप्त डेटा नहीं था कि SQL सर्वर पर विचार करने के लिए कुछ विकल्प हो, जहां अब अधिक विकल्प हैं, और कुछ खराब हैं। या शायद अन्य क्षणिक कारक हैं, जैसे कि तारीख के आंकड़े आदि, पूरी तरह से सुनिश्चित नहीं हैं।
सोलोमन रटज़की

@EricSwiggum मैं आपसे वहाँ असहमत नहीं हूँ। मुझे लगता है कि यह मेरे उत्तर की शुरुआत में बहुत समान है (यानी अमेरिकी अंग्रेजी प्रणालियों के लिए डिफ़ॉल्ट टकराव): माइक्रोसॉफ्ट की विरासत प्रणालियों के डर से उन्नयन पर त्रुटियां हो रही हैं (यानी पीछे की अनुकूलता की गारंटी) वास्तव में जितना अच्छा है उससे अधिक नुकसान करती है। गैर-आदर्श परिदृश्य के स्थापित-आधार / दायरे को बढ़ाता है। इससे अतीत में बने रहने के लिए यह एक बढ़ती हुई खींचतान है, और चीजों के बेहतर होने की संभावना कम हो जाती है। ये ऐसे मामले हैं जहां बैंड-सहायता को चीर देना बेहतर है और बस अब के साथ दर्द को खत्म करें।
सोलोमन रटज़की
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.