Database
 sql >> डेटाबेस >  >> RDS >> Database

ग्रीष्मकालीन प्रदर्शन पलूजा 2013 पर अनुवर्ती कार्रवाई

27 जून को, PASS परफॉर्मेंस वर्चुअल चैप्टर ने अपने 2013 के समर परफॉर्मेंस पलूजा का आयोजन किया - एक तरह का 24 घंटे का पास, लेकिन पूरी तरह से प्रदर्शन से संबंधित विषयों पर ध्यान केंद्रित किया। मैंने एक सत्र दिया, जिसका शीर्षक था, "10 बुरी आदतें जो प्रदर्शन को खराब कर सकती हैं," निम्नलिखित 10 अवधारणाओं का इलाज करते हुए:

  1. चुनें*
  2. ब्लाइंड इंडेक्स
  3. कोई स्कीमा उपसर्ग नहीं
  4. डिफ़ॉल्ट कर्सर विकल्प
  5. sp_ उपसर्ग
  6. कैश ब्लोट की अनुमति देना
  7. विस्तृत डेटा प्रकार
  8. SQL सर्वर डिफ़ॉल्ट
  9. कार्यों का अत्यधिक उपयोग
  10. "मेरी मशीन पर काम करता है"

आप मेरी "बुरी आदतें और सर्वोत्तम अभ्यास" वार्ता या हमारे साप्ताहिक क्वेरी ट्यूनिंग वेबिनार जैसी प्रस्तुतियों से इनमें से कुछ विषयों को याद कर सकते हैं जिन्हें मैं केविन क्लाइन के साथ इस सप्ताह की शुरुआत से होस्ट कर रहा हूं। (वैसे, वे 6 वीडियो अगस्त की शुरुआत में YouTube पर उपलब्ध होंगे।)

मेरे सत्र में 351 उपस्थित थे, और मुझे बहुत अच्छी प्रतिक्रिया मिली। मैं उसमें से कुछ को संबोधित करना चाहता था।

सबसे पहले, एक कॉन्फ़िगरेशन समस्या:मैं एक बिल्कुल नए माइक्रोफ़ोन का उपयोग कर रहा था, और मुझे नहीं पता था कि प्रत्येक कीस्ट्रोक गड़गड़ाहट की तरह ध्वनि करेगा। मैंने अपने बाह्य उपकरणों के बेहतर प्लेसमेंट के साथ उस मुद्दे का समाधान किया है, लेकिन मैं इससे प्रभावित सभी लोगों से माफी मांगना चाहता हूं।

अगला, डाउनलोड; डेक और नमूने घटना स्थल पर पोस्ट किए जाते हैं। वे पृष्ठ में सबसे नीचे हैं, लेकिन आप उन्हें यहीं से डाउनलोड भी कर सकते हैं।

अंत में, सत्र के दौरान पोस्ट किए गए प्रश्नों की एक सूची इस प्रकार है, और मैं यह सुनिश्चित करना चाहता था कि मैंने लाइव प्रश्नोत्तर के दौरान किसी भी उत्तर को संबोधित नहीं किया था। मैं क्षमा चाहता हूं कि मैंने इसे केवल एक महीने के भीतर निचोड़ लिया है , लेकिन वहां थे . थे बहुत सारे प्रश्न, और मैं उन्हें भागों में प्रकाशित नहीं करना चाहता था।

प्रश्न:यदि आपके पास एक ऐसी खरीद है जिसमें दिए गए मापदंडों के लिए बेतहाशा भिन्न इनपुट मान हो सकते हैं और परिणाम यह है कि कैश्ड योजना अधिकांश मामलों के लिए इष्टतम नहीं है, तो क्या RECOMPILE के साथ खरीद बनाना और छोटा लेना सबसे अच्छा है हर बार चलने पर प्रदर्शन प्रभावित होता है?

ए: आपको मामला-दर-मामला आधार पर इस तक पहुंचना होगा, क्योंकि यह वास्तव में विभिन्न कारकों (योजना की जटिलता सहित) पर निर्भर करेगा। यह भी ध्यान दें कि आप स्टेटमेंट-लेवल रीकंपाइल कर सकते हैं जैसे कि पूरे मॉड्यूल के विपरीत केवल प्रभावित स्टेटमेंट को हिट लेना पड़ता है। पॉल व्हाइट ने मुझे याद दिलाया कि लोग अक्सर RECOMPILE के साथ सूँघने वाले पैरामीटर को 'फिक्स' करते हैं , लेकिन अक्सर इसका अर्थ होता है 2000-शैली WITH RECOMPILE बेहतर OPTION (RECOMPILE) . के बजाय , जो न केवल स्वयं को कथन तक सीमित रखता है, बल्कि पैरामीटर एम्बेडिंग को भी सक्षम बनाता है, जो WITH RECOMPILE नहीं करता। इसलिए, यदि आप RECOMPILE . का उपयोग करने जा रहे हैं पैरामीटर सूँघने को विफल करने के लिए, इसे कथन में जोड़ें, न कि मॉड्यूल।

प्रश्न:यदि आप डायनेमिक sql पर फिर से संकलित करने के विकल्प का उपयोग करते हैं तो क्या आपको एक बड़ा प्रदर्शन हिट दिखाई देगा

ए: ऊपर के रूप में, यह योजनाओं की लागत और जटिलता पर निर्भर करेगा और कहने का कोई तरीका नहीं है, "हां, हमेशा एक बड़ा प्रदर्शन हिट होगा।" आपको विकल्प के साथ इसकी तुलना करना भी सुनिश्चित करना होगा।

प्रश्न:यदि सम्मिलित होने पर क्लस्टर अनुक्रमणिका है, बाद में जब हम डेटा पुनर्प्राप्त करते हैं, तो हम कनवर्ट फ़ंक्शन का उपयोग करते हैं, यदि प्रत्यक्ष तुलना का उपयोग करते हैं, तो क्वेरी दिनांक पढ़ने योग्य नहीं है, वास्तविक दुनिया में, बेहतर विकल्प क्या है

ए: मुझे यकीन नहीं है कि "वास्तविक दुनिया में पठनीय" का क्या अर्थ है। यदि आपका मतलब है कि आप एक विशिष्ट प्रारूप में आउटपुट चाहते हैं, तो आप आमतौर पर क्लाइंट साइड पर एक स्ट्रिंग में कनवर्ट करने से बेहतर होते हैं। C# और अधिकांश अन्य भाषाएँ जिनका आप प्रेजेंटेशन टियर में उपयोग कर रहे हैं, डेटाबेस से दिनांक/समय आउटपुट को किसी भी क्षेत्रीय प्रारूप में स्वरूपित करने में सक्षम हैं।

प्र:कोई कैसे निर्धारित करता है कि कितनी बार कैश्ड योजना का उपयोग किया गया है - क्या उस मूल्य के साथ कोई कॉलम है या इंटरनेट पर कोई प्रश्न है जो यह मान देगा? अंत में, क्या ऐसी गणना केवल अंतिम पुनरारंभ के बाद से ही प्रासंगिक होगी?

ए: अधिकांश DMV केवल अंतिम सेवा शुरू होने के बाद से ही मान्य होते हैं, और यहां तक ​​कि दूसरों को भी अधिक बार फ्लश किया जा सकता है (मांग पर भी - अनजाने में और उद्देश्य पर)। योजना कैश, निश्चित रूप से, निरंतर प्रवाह में है, और AFAIK योजनाएं जो कैश से बाहर निकलती हैं, यदि वे वापस पॉप करते हैं तो उनकी पिछली गिनती को बनाए नहीं रखते हैं। इसलिए जब भी आप कैश में कोई योजना देखते हैं तो मैं 100% नहीं हूं विश्वास है कि आप उपयोग की गई संख्या पर विश्वास कर सकते हैं।

उस ने कहा, जो आप शायद खोज रहे हैं वह है sys.dm_exec_cached_plans.usecounts और आपको sys.dm_exec_procedure_stats.execution_count भी मिल सकता है प्रक्रियाओं के लिए पूरक जानकारी में मदद करने के लिए जहां प्रक्रियाओं के भीतर अलग-अलग बयान कैश में नहीं मिलते हैं।

प्र:db इंजन को नए संस्करण में अपग्रेड करते समय लेकिन उपयोगकर्ता डेटाबेस को पुराने संगतता मोड में छोड़ने में क्या समस्याएं हैं?

ए: इसके आस-पास की मुख्य चिंता कुछ सिंटैक्स का उपयोग करने की क्षमता है, जैसे कि OUTER APPLY या तालिका-मूल्यवान फ़ंक्शन वाले चर। मुझे ऐसे किसी भी मामले की जानकारी नहीं है जहां कम संगतता का उपयोग करने से प्रदर्शन पर कोई सीधा प्रभाव पड़ता है, लेकिन आमतौर पर अनुशंसित कुछ चीजें इंडेक्स का पुनर्निर्माण और आंकड़े अपडेट करना (और अपने विक्रेता को नए संगतता स्तर ASAP का समर्थन करने के लिए) प्राप्त करना है। मैंने देखा है कि यह कई मामलों में अप्रत्याशित प्रदर्शन गिरावट का समाधान करता है, लेकिन मैंने कुछ राय भी सुनी हैं कि ऐसा करना आवश्यक नहीं है और शायद नासमझी भी है।

प्रश्न:* पर मौजूद क्लॉज करते समय क्या यह मायने रखता है

ए: नहीं, कम से कम प्रदर्शन के मामले में, एक अपवाद जहां SELECT * कोई फर्क नहीं पड़ता जब एक EXISTS के अंदर उपयोग किया जाता है खंड। लेकिन आप * का उपयोग क्यों करेंगे? यहाँ? मैं EXISTS (SELECT 1 ... - ऑप्टिमाइज़र उन लोगों के साथ समान व्यवहार करेगा, लेकिन एक तरह से यह कोड को स्व-दस्तावेज करता है और यह सुनिश्चित करता है कि पाठक समझते हैं कि सबक्वेरी कोई डेटा वापस नहीं करता है (भले ही वे बड़े EXISTS को याद करते हैं। बाहर)। कुछ लोग NULL . का उपयोग करते हैं , और मुझे नहीं पता कि मैंने 1 का उपयोग क्यों शुरू किया, लेकिन मुझे NULL मिलता है थोड़ा सहज भी।

*नोट* यदि आप EXISTS (SELECT * . का उपयोग करने का प्रयास करते हैं, तो आपको सावधान रहने की आवश्यकता होगी एक मॉड्यूल के अंदर जो स्कीमा-बाउंड है:

CREATE VIEW dbo.ThisWillNotWork
WITH SCHEMABINDING
AS
  SELECT BusinessEntityID
    FROM Person.Person AS p
	WHERE EXISTS (SELECT * FROM Sales.SalesOrderHeader AS h
	  WHERE h.SalesPersonID = p.BusinessEntityID);

आपको यह त्रुटि मिलती है:

Msg 1054, Level 15, State 6, प्रक्रिया ThisWillNotWork, Line 6
Syntax '*' को स्कीमा-बाउंड ऑब्जेक्ट में अनुमति नहीं है।

हालांकि इसे SELECT 1 . में बदल रहे हैं ठीक काम करता है। तो हो सकता है कि SELECT * . से बचने के लिए यह एक और तर्क हो उस परिदृश्य में भी।

प्र:क्या सर्वोत्तम कोडिंग मानकों के लिए कोई संसाधन लिंक है?

ए: विभिन्न भाषाओं में शायद सैकड़ों हैं। नामकरण परंपराओं की तरह, कोडिंग मानक एक बहुत ही व्यक्तिपरक चीज हैं। यह वास्तव में कोई फर्क नहीं पड़ता कि आप कौन सा सम्मेलन तय करते हैं जो आपके लिए सबसे अच्छा काम करता है; अगर आपको tbl पसंद है उपसर्ग, पागल हो जाओ! बिगएंडियन पर पास्कल को प्राथमिकता दें, इसे लें। अपने कॉलम नामों को डेटा प्रकार, जैसे intCustomerID . के साथ उपसर्ग करना चाहते हैं , मैं तुम्हें रोकने वाला नहीं हूँ। अधिक महत्वपूर्ण बात यह है कि आप एक सम्मेलन को परिभाषित करते हैं और इसे *लगातार नियोजित करते हैं।*

उन्होंने कहा, अगर आप मेरी राय चाहते हैं, तो मेरे पास उनकी कोई कमी नहीं है।

प्रश्न:क्या XACT_ABORT कुछ ऐसा है जिसका उपयोग SQL Server 2008 में किया जा सकता है?

ए: मुझे XACT_ABORT . को हटाने की किसी योजना के बारे में पता नहीं है इसलिए इसे ठीक काम करना जारी रखना चाहिए। सच कहूं तो मुझे अब यह बहुत बार उपयोग होता नहीं दिख रहा है कि हमारे पास TRY / CATCH है (और THROW SQL सर्वर 2012 के अनुसार)।

प्र:क्रॉस पर एक इनलाइन टेबल फ़ंक्शन कैसे लागू होता है, उस स्केलर फ़ंक्शन की तुलना में जिसे 1,000x कहा जाता था?

ए: मैंने इसका परीक्षण नहीं किया, लेकिन कई मामलों में एक स्केलर फ़ंक्शन को इनलाइन तालिका-मूल्यवान फ़ंक्शन के साथ बदलने से प्रदर्शन पर बहुत प्रभाव पड़ सकता है। मुझे जो समस्या मिलती है वह यह है कि इस स्विच को बनाने से सिस्टम पर पर्याप्त मात्रा में काम हो सकता है जो APPLY से पहले लिखा गया था। अस्तित्व में है, या अभी भी उन लोगों द्वारा प्रबंधित किया जाता है जिन्होंने इस बेहतर दृष्टिकोण को नहीं अपनाया है।

प्रश्न:मेरे पास एक प्रश्न है जो पहली बार वास्तव में धीमी गति से चलता है (~1मिनट) और हर बार तेज़ (~3सेकंड)। मैं यह देखना शुरू करूँ कि पहली बार प्रदर्शन समस्या कहाँ से आई है?

ए: दो चीजें दिमाग में आती हैं:(1) देरी को संकलन समय के साथ करना पड़ता है या (2) देरी को डेटा की मात्रा के साथ करना पड़ता है जो क्वेरी को संतुष्ट करने के लिए लोड किया जा रहा है, और पहली बार डिस्क से आना है और स्मृति नहीं। (1) के लिए आप SQL संतरी योजना एक्सप्लोरर में क्वेरी निष्पादित कर सकते हैं और स्टेटस बार आपको पहले और बाद के आमंत्रणों के लिए संकलन समय दिखाएगा (हालांकि इसके लिए एक मिनट अधिक लगता है, और असंभव है)। यदि आपको कोई अंतर नहीं मिलता है, तो यह केवल सिस्टम की प्रकृति हो सकती है:डेटा की मात्रा का समर्थन करने के लिए अपर्याप्त मेमोरी जिसे आप इस क्वेरी के साथ अन्य डेटा के संयोजन में लोड करने का प्रयास कर रहे हैं जो पहले से ही बफर पूल में था। यदि आपको विश्वास नहीं है कि इनमें से कोई भी समस्या है, तो देखें कि क्या दो अलग-अलग निष्पादन वास्तव में अलग-अलग योजनाएँ बनाते हैं - यदि कोई अंतर है, तो योजनाओं को answer.sqlperformance.com पर पोस्ट करें और हमें एक नज़र डालने में खुशी होगी . वास्तव में किसी भी स्थिति में प्लान एक्सप्लोरर का उपयोग करके दोनों निष्पादन के लिए वास्तविक योजनाओं को कैप्चर करना आपको I/O में किसी भी अंतर के बारे में भी बता सकता है और जहां SQL सर्वर अपना समय पहले, धीमी गति से खर्च कर रहा है, वहां ले जा सकता है।

प्रश्न:मुझे sp_executesql का उपयोग करके पैरामीटर सूँघना मिल रहा है, क्या तदर्थ कार्यभार के लिए ऑप्टिमाइज़ इसे हल करेगा क्योंकि केवल प्लान स्टब कैश में है?

ए: नहीं, मुझे नहीं लगता कि तदर्थ कार्यभार के लिए ऑप्टिमाइज़ सेटिंग इस परिदृश्य में मदद करेगी, क्योंकि पैरामीटर सूँघने का अर्थ है कि एक ही योजना के बाद के निष्पादन का उपयोग विभिन्न मापदंडों के लिए और काफी भिन्न प्रदर्शन व्यवहारों के साथ किया जाता है। तदर्थ कार्यभार के लिए ऑप्टिमाइज़ का उपयोग योजना कैश पर भारी प्रभाव को कम करने के लिए किया जाता है जो तब हो सकता है जब आपके पास विभिन्न SQL कथनों की संख्या अधिक हो। इसलिए जब तक आप sp_executesql पर भेजे जा रहे कई अलग-अलग स्टेटमेंट के प्लान कैश पर प्रभाव के बारे में बात नहीं कर रहे हैं - जिसे पैरामीटर सूँघने के रूप में वर्णित नहीं किया जाएगा - मुझे लगता है कि OPTION (RECOMPILE) के साथ प्रयोग करना एक बेहतर परिणाम हो सकता है या, यदि आप पैरामीटर मानों को जानते हैं जो विभिन्न पैरामीटर संयोजनों में *do* अच्छे परिणाम देते हैं, तो OPTIMIZE FOR का उपयोग करें . पॉल व्हाइट का यह उत्तर बेहतर अंतर्दृष्टि प्रदान कर सकता है।

प्र:क्या डायनेमिक SQL चलाने और क्वेरी प्लान को सेव न करने का कोई तरीका है?

ए: बिल्कुल, बस OPTION (RECOMPILE) शामिल करें गतिशील SQL पाठ में:

DBCC FREEPROCCACHE;
 
USE AdventureWorks2012;
GO
SET NOCOUNT ON;
GO
 
EXEC sp_executesql 
  N'SELECT TOP (1) * INTO #x FROM Sales.SalesOrderHeader;';
GO
EXEC sp_executesql 
  N'SELECT TOP (1) * INTO #x FROM Sales.SalesOrderDetail OPTION (RECOMPILE);'
GO
 
SELECT t.[text], p.usecounts
FROM sys.dm_exec_cached_plans AS p
CROSS APPLY sys.dm_exec_sql_text(p.[plan_handle]) AS t
WHERE t.[text] LIKE N'%Sales.' + 'SalesOrder%';

परिणाम:Sales.SalesOrderHeader . दिखाने वाली 1 पंक्ति सवाल।

अब, यदि बैच में किसी स्टेटमेंट में OPTION (RECOMPILE) शामिल नहीं है , योजना अभी भी कैश की जा सकती है, इसे फिर से उपयोग नहीं किया जा सकता है।

प्रश्न:क्या आप दिनांक के बीच उदाहरण #9 से उपयोग कर सकते हैं यदि>=और

ए: खैर, BETWEEN शब्दार्थ रूप से >= AND < . के बराबर नहीं है , बल्कि >= AND <= , और ठीक उसी तरह से अनुकूलित और प्रदर्शन करता है। किसी भी मामले में, मैं जानबूझकर BETWEEN . का उपयोग नहीं करता हूं दिनांक सीमा प्रश्नों पर - कभी भी - क्योंकि इसे ओपन-एंडेड श्रेणी बनाने का कोई तरीका नहीं है। BETWEEN . के साथ , दोनों छोर समावेशी हैं, और यह अंतर्निहित डेटा प्रकार के आधार पर बहुत समस्याग्रस्त हो सकता है (अभी या भविष्य में किसी परिवर्तन के कारण जिसके बारे में आप नहीं जानते होंगे)। शीर्षक थोड़ा कठोर लग सकता है, लेकिन मैं निम्नलिखित ब्लॉग पोस्ट में इसके बारे में विस्तार से बताता हूं:

शैतान और शैतान के बीच क्या समानता है?

प्र:कर्सर में "स्थानीय fast_forward" वास्तव में क्या करता है?

ए: FAST_FORWARD वास्तव में READ_ONLY . का संक्षिप्त रूप है और FORWARD_ONLY . यहाँ वे क्या करते हैं:

  • LOCAL ऐसा बनाता है ताकि बाहरी क्षेत्र (डिफ़ॉल्ट रूप से एक कर्सर GLOBAL . है) जब तक कि आपने इंस्टेंस-स्तरीय विकल्प नहीं बदला है)।
  • READ_ONLY इसे बनाता है ताकि आप सीधे कर्सर को अपडेट न कर सकें, उदा। WHERE CURRENT OF . का उपयोग कर रहे हैं .
  • FORWARD_ONLY स्क्रॉल करने की क्षमता को रोकता है, उदा। FETCH PRIOR . का उपयोग करके या FETCH ABSOLUTE इसके बजाय FETCH NEXT .

इन विकल्पों को सेट करना, जैसा कि मैंने दिखाया (और ब्लॉग किया है), प्रदर्शन पर महत्वपूर्ण प्रभाव डाल सकता है। बहुत कम ही मुझे उत्पादन में ऐसे कर्सर दिखाई देते हैं जिन्हें वास्तव में सुविधाओं के इस सेट से विचलित होने की आवश्यकता होती है, लेकिन आमतौर पर वे वैसे भी बहुत अधिक महंगी चूक को स्वीकार करने के लिए लिखे जाते हैं।

प्र:क्या अधिक कुशल है, एक कर्सर या थोड़ी देर का लूप?

ए: एक WHILE लूप शायद डिफ़ॉल्ट विकल्पों वाले समकक्ष कर्सर की तुलना में अधिक कुशल होगा, लेकिन मुझे संदेह है कि यदि आप LOCAL FAST_FORWARD का उपयोग करते हैं तो आपको कोई अंतर नहीं मिलेगा। . सामान्यतया, एक WHILE लूप *is* बिना कर्सर कहे एक कर्सर है, और मैंने पिछले साल मुझे गलत साबित करने के लिए कुछ उच्च सम्मानित सहयोगियों को चुनौती दी थी। उनका WHILE लूप इतना अच्छा नहीं रहा।

प्रश्न:आप उपयोगकर्ता संग्रहीत कार्यविधियों के लिए usp उपसर्ग की अनुशंसा नहीं करते हैं, क्या इसका वही नकारात्मक प्रभाव पड़ता है?

ए: एक usp_ उपसर्ग (या sp_ . के अलावा कोई भी उपसर्ग , या उस मामले के लिए कोई उपसर्ग नहीं) *नहीं* का वही प्रभाव है जो मैंने प्रदर्शित किया था। हालांकि मुझे संग्रहीत प्रक्रियाओं पर उपसर्ग का उपयोग करने में बहुत कम मूल्य मिलता है क्योंकि बहुत कम ही कभी कोई संदेह होता है कि जब मुझे कोड मिलता है जो कहता है EXEC something , कि कुछ संग्रहीत प्रक्रिया है - इसलिए वहां बहुत कम मूल्य है (इसके विपरीत, कहें, उन्हें तालिकाओं से अलग करने के लिए उपसर्ग करना, क्योंकि उन्हें एक दूसरे के रूप में इस्तेमाल किया जा सकता है)। प्रत्येक प्रक्रिया को एक ही उपसर्ग देने से उस वस्तु को ढूंढना भी कठिन हो जाता है, जिसमें आप हैं, कहते हैं, ऑब्जेक्ट एक्सप्लोरर। कल्पना कीजिए कि यदि फ़ोन बुक में प्रत्येक अंतिम नाम LastName_ . से पहले लगा होता - यह किस तरह से आपकी मदद करता है?

प्र:क्या कैश्ड योजनाओं को साफ करने का कोई तरीका है जहां एकाधिक प्रतियां हैं?

ए: हां! ठीक है, अगर आप SQL Server 2008 या इससे अधिक पर हैं। एक बार जब आप दो समान योजनाओं की पहचान कर लेते हैं, तब भी उनके पास अलग-अलग plan_handle . होंगे मूल्य। इसलिए, उसे पहचानें जिसे आप *नहीं* रखना चाहते हैं, उसके plan_handle को कॉपी करें , और इसे इस DBCC . के अंदर डालें आदेश:

DBCC FREEPROCCACHE(0x06.....);
प्रश्न:क्या किसी खरीद में इफ इत्यादी आदि का उपयोग करने से खराब योजनाएं होती हैं, क्या यह पहले रन के लिए अनुकूलित हो जाती है और केवल उस पथ के लिए अनुकूलित होती है? तो क्या प्रत्येक IF में कोड के अनुभागों को अलग-अलग प्रक्रियाओं में बनाने की आवश्यकता है?

ए: चूंकि SQL सर्वर अब स्टेटमेंट-लेवल ऑप्टिमाइज़ेशन कर सकता है, इसका आज कम कठोर प्रभाव है जो पुराने संस्करणों पर था, जहाँ पूरी प्रक्रिया को एक इकाई के रूप में पुन:संकलित किया जाना था।

प्रश्न:मैंने कभी-कभी पाया कि डायनेमिक sql लिखना बेहतर हो सकता है क्योंकि यह sp के लिए पैरामीटर सूँघने की समस्या को समाप्त करता है। क्या ये सच है ? क्या इस परिदृश्य के बारे में कोई समझौता या अन्य विचार किया जाना है?

ए: हां, डायनेमिक SQL अक्सर पैरामीटर सूँघने को विफल कर सकता है, विशेष रूप से उस स्थिति में जहां एक विशाल "रसोई सिंक" क्वेरी में बहुत सारे वैकल्पिक पैरामीटर होते हैं। मैंने उपरोक्त प्रश्नों में कुछ अन्य बातों पर विचार किया है।

प्रश्न:यदि मेरी टेबल पर DATEPART(mycolumn, year) के रूप में एक परिकलित कॉलम होता है और उस पर इंडेक्स में होता है, तो क्या SQL सर्वर SEEK के साथ इसका उपयोग करेगा?

ए: यह होना चाहिए, लेकिन निश्चित रूप से यह क्वेरी पर निर्भर करता है। इंडेक्स आउटपुट कॉलम को कवर करने या अन्य फ़िल्टर को संतुष्ट करने के लिए उपयुक्त नहीं हो सकता है और आपके द्वारा उपयोग किया जाने वाला पैरामीटर किसी खोज को उचित ठहराने के लिए पर्याप्त चुनिंदा नहीं हो सकता है।

प्रश्न:क्या प्रत्येक प्रश्न के लिए एक योजना तैयार की जाती है? क्या कोई योजना तुच्छ लोगों के लिए भी बनाई जाती है?

ए: जहां तक ​​​​मुझे पता है, प्रत्येक वैध क्वेरी, यहां तक ​​​​कि छोटी योजनाओं के लिए एक योजना तैयार की जाती है, जब तक कि कोई त्रुटि न हो जो किसी योजना को उत्पन्न होने से रोकती है (यह कई परिदृश्यों में हो सकती है, जैसे अमान्य संकेत)। वे कैश्ड हैं या नहीं (और वे कितने समय तक कैश में रहते हैं) कई अन्य कारकों पर निर्भर करता है, जिनमें से कुछ के बारे में मैंने ऊपर चर्चा की है।

प्र:क्या sp_executesql को कॉल करने से कैश्ड प्लान जेनरेट (और पुन:उपयोग) होता है?

ए: हां, यदि आप ठीक वही क्वेरी टेक्स्ट भेजते हैं, तो इससे कोई फर्क नहीं पड़ता कि आप इसे सीधे जारी करते हैं या इसे sp_executesql के माध्यम से भेजते हैं। , SQL सर्वर योजना को कैश और पुन:उपयोग करेगा।

प्र:क्या एक नियम (एक देव वातावरण के लिए) लागू करना ठीक है जहां सभी देव मशीनें तत्काल फ़ाइल आरंभीकरण का उपयोग करती हैं?

ए: मैं नहीं देखता क्यों नहीं। मेरी एकमात्र चिंता यह होगी कि तत्काल फ़ाइल आरंभीकरण के साथ डेवलपर्स बड़ी संख्या में ऑटोग्रो घटनाओं को नोटिस नहीं कर सकते हैं, जो खराब ऑटोग्रोथ सेटिंग्स को प्रतिबिंबित कर सकते हैं जो उत्पादन वातावरण पर बहुत अलग प्रभाव डाल सकते हैं (विशेषकर यदि उनमें से कोई भी सर्वर * नहीं करता है * IFI सक्षम है)।

प्रश्न:सेलेक्ट क्लॉज में फंक्शन के साथ, क्या यह कहना सही होगा कि कोड को डुप्लिकेट करना बेहतर है?

ए: व्यक्तिगत रूप से, मैं हाँ कहूंगा। स्केलर फ़ंक्शंस को SELECT . में बदलने से मुझे बहुत अधिक प्रदर्शन लाभ मिला है एक इनलाइन समकक्ष के साथ सूची, यहां तक ​​​​कि उन मामलों में जहां मुझे उस कोड को दोहराना है। जैसा कि ऊपर उल्लेख किया गया है, हालांकि, आप कुछ मामलों में पा सकते हैं कि इसे एक इनलाइन तालिका-मूल्यवान फ़ंक्शन के साथ बदलने से आपको खराब प्रदर्शन दंड के बिना कोड का पुन:उपयोग मिल सकता है।

प्रश्न:क्या हम उत्पादन डेटा का उपयोग करने (प्राप्त करने के लिए कठिन) के बजाय विकास के उपयोग के लिए समान डेटा आकार प्राप्त करने के लिए डेटा जनरेटर का उपयोग कर सकते हैं? क्या परिणामी योजनाओं के लिए डेटा तिरछा महत्वपूर्ण है?

ए: डेटा तिरछा एक कारक हो सकता है, और मुझे संदेह है कि यह इस बात पर निर्भर करता है कि आप किस प्रकार का डेटा उत्पन्न/अनुकरण कर रहे हैं और तिरछा कितना दूर हो सकता है। यदि आपके पास एक वर्कर (100) कॉलम है, जो उत्पादन में आम तौर पर 90 वर्ण लंबा होता है और आपकी डेटा पीढ़ी औसत 50 डेटा उत्पन्न करती है (जो कि SQL सर्वर मान लेगा), तो आपको संख्या पर बहुत अलग प्रभाव मिलेगा। पृष्ठों और अनुकूलन की संख्या, और शायद बहुत यथार्थवादी परीक्षण नहीं।

लेकिन मैं ईमानदार रहूंगा:यह विशिष्ट पहलू ऐसा कुछ नहीं है जिसमें मैंने बहुत समय लगाया है, क्योंकि मैं आमतौर पर वास्तविक डेटा प्राप्त करने के लिए अपना रास्ता धमका सकता हूं। :-)

प्रश्न:क्या क्वेरी प्रदर्शन की जांच करते समय सभी फ़ंक्शन समान बनाए गए हैं? यदि नहीं, तो ज्ञात कार्यों की एक सूची है, जब संभव हो तो आपको बचना चाहिए?

ए: नहीं, प्रदर्शन के मामले में सभी फ़ंक्शन समान नहीं बनाए गए हैं। तीन अलग-अलग प्रकार के कार्य हैं जिन्हें हम बना सकते हैं (फिलहाल सीएलआर कार्यों को अनदेखा कर रहे हैं):

  • बहु-कथन अदिश कार्य
  • बहु-कथन तालिका-मूल्यवान कार्य
  • इनलाइन तालिका-मूल्यवान फ़ंक्शन
    इनलाइन स्केलर फ़ंक्शंस का उल्लेख दस्तावेज़ीकरण में किया गया है, लेकिन वे एक मिथक हैं और, SQL सर्वर के रूप में 2014 कम से कम, Sasquatch और Loch Ness Monster के साथ भी उल्लेख किया जा सकता है।

सामान्य तौर पर, और मैं इसे 80pt फ़ॉन्ट में रखूंगा यदि मैं कर सकता हूं, तो इनलाइन तालिका-मूल्यवान फ़ंक्शन अच्छे हैं, और जब संभव हो तो अन्य से बचा जाना चाहिए, क्योंकि उन्हें अनुकूलित करना बहुत कठिन होता है।

फ़ंक्शंस में अलग-अलग गुण भी हो सकते हैं जो उनके प्रदर्शन को प्रभावित करते हैं, जैसे कि क्या वे नियतात्मक हैं और क्या वे स्कीमा-बाउंड हैं।

कई फ़ंक्शन पैटर्न के लिए, निश्चित रूप से प्रदर्शन संबंधी विचार हैं जिन्हें आपको बनाने की आवश्यकता है, और आपको इस कनेक्ट आइटम के बारे में भी पता होना चाहिए जिसका उद्देश्य उन्हें संबोधित करना है।

प्र:क्या हम कर्सर के बिना योग चलाना जारी रख सकते हैं?

ए: हाँ हम कर सकते हैं; कर्सर के अलावा और भी कई तरीके हैं (जैसा कि मेरे ब्लॉग पोस्ट में बताया गया है, कुल योग चलाने के लिए सर्वोत्तम दृष्टिकोण - SQL सर्वर 2012 के लिए अपडेट किया गया):

  • चयन सूची में सबक्वेरी
  • पुनरावर्ती सीटीई
  • स्व-जुड़ें
  • "अजीब अपडेट"
  • केवल SQL सर्वर 2012+:SUM() OVER() (डिफ़ॉल्ट / RANGE का उपयोग करके)
  • केवल SQL सर्वर 2012+:SUM() OVER() (पंक्तियों का उपयोग करके)

यदि आप SQL Server 2012 पर हैं तो अंतिम विकल्प अब तक का सबसे अच्छा तरीका है; यदि नहीं, तो अन्य गैर-कर्सर विकल्पों पर प्रतिबंध हैं जो अक्सर एक कर्सर को अधिक आकर्षक विकल्प बना देंगे। उदाहरण के लिए, क्वर्की अपडेट विधि अनियंत्रित है और आपके अपेक्षित क्रम में काम करने की गारंटी नहीं है; पुनरावर्ती सीटीई के लिए आवश्यक है कि आप जो भी अनुक्रमिक तंत्र का उपयोग कर रहे हैं उसमें कोई अंतराल न हो; और सबक्वेरी और सेल्फ-जॉइन दृष्टिकोण बस स्केल नहीं करते हैं।


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. TimescaleDB के लिए स्वचालित विफलता कैसे प्राप्त करें

  2. शुरुआती के लिए एसक्यूएल ड्रॉप कॉलम

  3. स्वादिष्ट भोजन परोसना (और डेटा) - रेस्तरां के लिए एक डेटा मॉडल

  4. पुनरावर्तनीय पढ़ें अलगाव स्तर

  5. स्टार स्कीमा बनाम स्नोफ्लेक स्कीमा