पसंदीदा प्रदर्शन ट्यूनिंग ट्रिक्स [बंद]


126

जब आपके पास एक क्वेरी या संग्रहीत कार्यविधि होती है जिसमें प्रदर्शन ट्यूनिंग की आवश्यकता होती है, तो आपके द्वारा पहले किए गए कुछ प्रयास क्या हैं?


यहाँ कुछ SQL सर्वर क्वेरी ऑप्टिमाइज़ेशन ट्रिक्स हैं
SQLMenace

मैं मानता हूं कि यह रचनात्मक नहीं है और इसे Google में खोजा जा सकता है, लेकिन इसमें 118 यूवी क्यों हैं ?! :)
फ़्लिकर

जवाबों:


114

यहाँ उन चीजों की आसान सूची है, जो मैं हमेशा अनुकूलन के बारे में पूछने वाले किसी व्यक्ति को देता हूं।
हम मुख्य रूप से साइबेस का उपयोग करते हैं, लेकिन अधिकांश सलाह बोर्ड पर लागू होगी।

उदाहरण के लिए, SQL सर्वर, प्रदर्शन निगरानी / ट्यूनिंग बिट्स के एक मेजबान के साथ आता है, लेकिन अगर आपके पास ऐसा कुछ नहीं है (और शायद आप भी करते हैं) तो मैं निम्नलिखित पर विचार करूंगा ...

99% समस्याएं जो मैंने देखी हैं, वे बहुत सी तालिकाओं को एक सम्मिलित में रखने के कारण होती हैं । इसके लिए तय है कि आप आधी ज्वाइनिंग (कुछ टेबल के साथ) करें और नतीजों को अस्थायी टेबल में कैशे करें। फिर उस अस्थायी तालिका में शेष क्वेरी को मिलाएं।

क्वेरी ऑप्टिमाइज़ेशन चेकलिस्ट

  • अंतर्निहित तालिकाओं पर अद्यतन सांख्यिकी चलाएँ
    • कई सिस्टम इसे अनुसूचित साप्ताहिक नौकरी के रूप में चलाते हैं
  • अंतर्निहित तालिकाओं से रिकॉर्ड हटाएं (संभवतः हटाए गए अभिलेखों को संग्रहीत करें)
    • दिन में एक बार या सप्ताह में एक बार स्वचालित रूप से ऐसा करने पर विचार करें।
  • अनुक्रमणिका पुन: बनाएँ
  • Tables का पुनर्निर्माण (bcp data out / in)
  • डेटाबेस को डंप / रीलोड करें (कठोर, लेकिन भ्रष्टाचार को ठीक कर सकते हैं)
  • नया, अधिक उपयुक्त सूचकांक बनाएँ
  • डेटाबेस में संभावित भ्रष्टाचार है या नहीं यह देखने के लिए DBCC चलाएँ
  • ताले / डेडलॉक
    • डेटाबेस में चल रही कोई अन्य प्रक्रिया सुनिश्चित करें
      • खासकर डीबीसीसी
    • क्या आप पंक्ति या पृष्ठ स्तर लॉकिंग का उपयोग कर रहे हैं?
    • क्वेरी शुरू करने से पहले विशेष रूप से तालिकाओं को लॉक करें
    • जांचें कि सभी प्रक्रियाएं एक ही क्रम में तालिकाओं तक पहुंच रही हैं
  • क्या सूचकांकों का उचित उपयोग किया जा रहा है?
    • जुड़ने वाले केवल इंडेक्स का उपयोग करेंगे यदि दोनों अभिव्यक्तियां समान डेटा प्रकार हैं
    • इंडेक्स का उपयोग केवल तभी किया जाएगा जब इंडेक्स पर पहला फ़ील्ड (क्वेरी) मिलान किया गया हो
    • क्या संकुल सूचकांकों का उपयोग उचित है?
      • रेंज डेटा
      • मान 1 और मान 2 के बीच का क्षेत्र कहाँ है
  • छोटे जोड़ अच्छे संयोग हैं
    • डिफ़ॉल्ट रूप से ऑप्टिमाइज़र केवल एक बार में तालिकाओं 4 पर विचार करेगा।
    • इसका मतलब है कि 4 से अधिक तालिकाओं के साथ जुड़ने पर, गैर-इष्टतम क्वेरी योजना चुनने का एक अच्छा मौका है
  • जोड़ तोड़ो
    • क्या आप जोड़ तोड़ सकते हैं?
    • एक अस्थायी तालिका में विदेशी कुंजियों का चयन करें
    • आधे में शामिल हों और एक अस्थायी तालिका में परिणाम डालें
  • क्या आप सही प्रकार की अस्थायी तालिका का उपयोग कर रहे हैं?
    • #tempटेबल @tableबड़े संस्करणों (हजारों पंक्तियों) के साथ चर की तुलना में बहुत बेहतर प्रदर्शन कर सकते हैं ।
  • सारांश सारणी बनाए रखें
    • अंतर्निहित तालिकाओं पर ट्रिगर के साथ बनाएँ
    • दैनिक / प्रति घंटा / आदि का निर्माण
    • तदर्थ बनाएँ
    • वृद्धिशील या अशांति / पुनर्निर्माण करें
  • देखें कि SET SHOWPLAN ON के साथ क्वेरी योजना क्या है
  • देखें कि वास्तव में SET STATS IO ON के साथ क्या हो रहा है
  • सूचकांक का प्रयोग करने वाले सूचकांक को बाध्य करें: (सूचकांक: myindex)
  • SET FORCEPLAN ON का उपयोग करके टेबल ऑर्डर को फोर्स करें
  • पैरामीटर सूँघना:
    • 2 में संग्रहीत प्रक्रिया को तोड़ें
    • proc1 से proc2 कॉल करें
    • ऑप्टिमाइज़र को proc2 में इंडेक्स चुनने की अनुमति देता है अगर @ 1 को proc1 द्वारा बदला गया है
  • क्या आप अपना हार्डवेयर सुधार सकते हैं?
  • कितने बजे चल रहे हो? क्या एक शांत समय है?
  • क्या प्रतिकृति सर्वर (या अन्य गैर-स्टॉप प्रक्रिया) चल रहा है? क्या आप इसे निलंबित कर सकते हैं? इसे भागो। प्रति घंटा की?

2
आप किस बिट का संदर्भ ले रहे हैं?
ए जे।

2
यह कुछ अच्छा सामान है, लेकिन मैं चाहता हूं कि आपके पास कुछ दावों के लिए कुछ संदर्भ होंगे। उदाहरण के लिए: मैंने कभी नहीं सुना है कि ऑप्टिमाइज़ेशन केवल एक बार में 4 तालिकाओं पर विचार करता है। मुझे समझ नहीं आता कि यह कैसे सही हो सकता है। क्या आप इसके लिए कुछ संदर्भ प्रदान कर सकते हैं? मुझे यह देखना अच्छा लगेगा कि आपको यह कहां मिल रहा है।
शेल्डन

19
  1. अपने सिर में क्वेरी चलाने के इष्टतम पथ का एक बहुत अच्छा विचार है।
  2. क्वेरी प्लान की जाँच करें - हमेशा।
  3. STATS चालू करें, ताकि आप IO और CPU प्रदर्शन की जांच कर सकें। उन नंबरों को नीचे लाने पर ध्यान दें, जरूरी नहीं कि क्वेरी समय (जैसा कि अन्य गतिविधि, कैश, आदि से प्रभावित हो सकता है)।
  4. एक ऑपरेटर में आने वाली बड़ी संख्या में पंक्तियों की तलाश करें, लेकिन छोटी संख्याएं निकल रही हैं। आमतौर पर, एक सूचकांक आने वाली पंक्तियों की संख्या को सीमित करने में मदद करेगा (जो डिस्क रीड को बचाता है)।
  5. सबसे बड़ी लागत सबट्री पर ध्यान दें। उस सबट्री को बदलना अक्सर पूरी क्वेरी योजना को बदल सकता है।
  6. आम समस्याएं जो मैंने देखी हैं:
    • यदि बहुत सारे जोड़ हैं, तो कभी-कभी Sql Server, जोड़ों का विस्तार करने का चयन करेगा, और फिर WHERE क्लॉस लागू करेगा। आप आमतौर पर WHERE की शर्तों को JOIN क्लॉज में स्थानांतरित करके या इनरलाइज्ड शर्तों के साथ एक व्युत्पन्न तालिका द्वारा इसे ठीक कर सकते हैं। दृश्य वही समस्याएं पैदा कर सकते हैं।
    • सबोप्टाइमल ज्वाइन (LOOP vs HASH vs MERGE)। अंगूठे का मेरा नियम एक LOOP का उपयोग करना है जब शीर्ष पंक्ति में नीचे की तुलना में बहुत कम पंक्तियाँ होती हैं, एक MERGE जब सेट लगभग समान होते हैं और आदेश दिए जाते हैं, और बाकी सब के लिए एक HASH होता है। जॉइन हिंट जोड़ना आपको अपने सिद्धांत का परीक्षण करने देगा।
    • व्यास सूँघने। यदि आपने पहली बार स्टोर किए गए खरीद को अवास्तविक मूल्यों के साथ चलाया (जैसे कि परीक्षण के लिए), तो कैश्ड क्वेरी योजना आपके उत्पादन मूल्यों के लिए उप-प्रकार हो सकती है। RECOMPILE के साथ फिर से चलना इसे सत्यापित करना चाहिए। कुछ संग्रहित procs के लिए, विशेष रूप से वे जो अलग-अलग आकार की श्रेणियों के साथ काम करते हैं (कहते हैं, आज और कल के बीच की सभी तिथियां - जो किसी INDEX SEEK को प्राप्त करेंगी - या, पिछले वर्ष और इस वर्ष के बीच की सभी तिथियां - जो किसी INDEX SCAN के साथ बेहतर होंगी ) आपको इसे हर बार RECOMPILE के साथ चलाना पड़ सकता है।
    • खराब इंडेंटेशन ... ठीक है, इसलिए Sql सर्वर के पास इसके साथ कोई समस्या नहीं है - लेकिन मुझे यकीन है कि एक क्वेरी को समझना असंभव है जब तक कि मैंने फॉर्मेटिंग को ठीक नहीं किया है।

1
खराब इंडेंटेशन को शामिल करने के लिए +1। स्वरूपण कुंजी है! :)
mwigdahl

18

विषय से थोड़ा दूर लेकिन अगर आपका इन मुद्दों पर नियंत्रण है ...
उच्च स्तर और उच्च प्रभाव।

  • उच्च IO वातावरण के लिए सुनिश्चित करें कि आपके डिस्क RAID 10 या RAID 0 + 1 या छापे 1 और छापे 0 के कुछ नेस्टेड कार्यान्वयन के लिए हैं।
  • 1500K से कम ड्राइव का उपयोग न करें।
  • सुनिश्चित करें कि आपके डिस्क केवल आपके डेटाबेस के लिए उपयोग किए जाते हैं। IE कोई लॉगिंग नहीं ओएस।
  • ऑटो बढ़ने या इसी तरह की सुविधा को बंद करें। डेटाबेस प्रत्याशित सभी संग्रहण का उपयोग करें। जरूरी नहीं कि वर्तमान में जो प्रयोग किया जा रहा है।
  • प्रकार प्रश्नों के लिए अपने स्कीमा और इंडेक्स को डिज़ाइन करें।
  • यदि यह एक लॉग प्रकार तालिका है (केवल सम्मिलित करें) और DB में होना चाहिए इसे अनुक्रमणित न करें।
  • यदि आपकी रिपोर्टिंग का आवंटन (कई जोड़ के साथ जटिल चयन करता है) तो आपको एक स्टार या स्नोफ्लेक स्कीमा के साथ डेटा वेयरहाउस बनाने पर ध्यान देना चाहिए।
  • प्रदर्शन के बदले में डेटा की नकल करने से डरो मत!

8

CREATE INDEX

आश्वासन दें कि आपके WHEREऔर JOINक्लॉस के लिए इंडेक्स उपलब्ध हैं। यह डेटा एक्सेस को बहुत तेज कर देगा।

यदि आपका वातावरण डेटा मार्ट या वेयरहाउस है, तो अनुक्रमणिका को लगभग किसी भी बोधगम्य क्वेरी के लिए छोड़ देना चाहिए।

एक लेन-देन के माहौल में , अनुक्रमित की संख्या कम होनी चाहिए और उनकी परिभाषाएं अधिक रणनीतिक होनी चाहिए ताकि सूचकांक रखरखाव संसाधनों को नीचे न खींचे। (इंडेक्स मेंटेनेंस तब होता है जब इंडेक्स की पत्तियों को अंतर्निहित तालिका में परिवर्तन को दर्शाने के लिए बदलना चाहिए, जैसा कि INSERT, UPDATE,और DELETEसंचालन के साथ ।)

इसके अलावा, सूचकांक में फ़ील्ड्स के क्रम के प्रति सावधान रहें - जितना अधिक चयनात्मक (उच्च कार्डिनैलिटी) एक फ़ील्ड, सूचकांक में यह पहले दिखाई देना चाहिए। उदाहरण के लिए, कहें कि आप प्रयुक्त ऑटोमोबाइल के लिए क्वेरी कर रहे हैं:

SELECT   i.make, i.model, i.price
FROM     dbo.inventory i
WHERE    i.color = 'red'
  AND    i.price BETWEEN 15000 AND 18000

आमतौर पर मूल्य में उच्च कार्डिनलिटी होती है। केवल कुछ दर्जन रंग उपलब्ध हो सकते हैं, लेकिन संभवतः हजारों अलग-अलग पूछ मूल्य हैं।

इन अनुक्रमणिका विकल्पों में से, idx01क्वेरी को संतुष्ट करने के लिए तेज़ पथ प्रदान करता है:

CREATE INDEX idx01 ON dbo.inventory (price, color)
CREATE INDEX idx02 ON dbo.inventory (color, price)

ऐसा इसलिए है क्योंकि कम कारें रंग पसंद की तुलना में मूल्य बिंदु को संतुष्ट करेंगी, क्वेरी इंजन को विश्लेषण करने के लिए कम डेटा देगी।

मुझे पता है कि दो बहुत ही समान अनुक्रमित हैं जो केवल एक में प्रश्नों (पहले नाम, अंतिम नाम) को गति देने के लिए और दूसरे में (अंतिम नाम, प्रथम नाम) को अलग करने के लिए फ़ील्ड क्रम में हैं।


6

एक ट्रिक जो मैंने हाल ही में सीखी है, वह यह है कि SQL सर्वर अपडेट स्टेटमेंट में स्थानीय वेरिएबल्स के साथ-साथ फील्ड को भी अपडेट कर सकता है।

UPDATE table
SET @variable = column = @variable + otherColumn

या अधिक पठनीय संस्करण:

UPDATE table
SET
    @variable = @variable + otherColumn,
    column = @variable

मैंने पुनरावर्ती गणनाओं को लागू करते समय जटिल अभिशापों / जोड़ों को बदलने के लिए इसका उपयोग किया है, और प्रदर्शन में भी बहुत कुछ हासिल किया है।

यहाँ विवरण और उदाहरण कोड है कि प्रदर्शन में शानदार सुधार किया है: http://geekswithblogs.net/Rhames/archive/2008/10/28/calculating-running-totals-in-sql-server-2005-----optimal। aspx


5

यहां MySQL की मानें, तो क्वेरी के साथ क्या हो रहा है, यह जानने के लिए EXPLAIN का उपयोग करें, सुनिश्चित करें कि इंडेक्स को यथासंभव कुशलता से उपयोग किया जा रहा है और फ़ाइल प्रकारों को समाप्त करने का प्रयास करें। उच्च प्रदर्शन MySQL: अनुकूलन, बैकअप, प्रतिकृति, और अधिक इस विषय पर एक महान पुस्तक है जैसा कि MySQL Performance Blog है


3
यह MySQL के लिए अच्छा है, लेकिन सवाल "sqlserver" को टैग किया गया था। फिर भी, यह एक अच्छी बात है। SSMS में सबसे महत्वपूर्ण बात यह है कि "प्रदर्शन अनुमानित निष्पादन योजना" और "वास्तविक निष्पादन योजना शामिल करें" का उपयोग करें। यदि आप विशाल तालिका स्कैन को समाप्त कर सकते हैं और क्लस्टर इंडेक्स का उपयोग कर सकते हैं, तो आप इष्टतम प्रदर्शन के लिए अपने रास्ते पर हैं।
eksortso


3

कभी-कभी SQL सर्वर में यदि आप OR का उपयोग करते हैं जहां एक क्लॉज में यह प्रदर्शन के साथ वास्तव में जैक होगा। OR का उपयोग करने के बजाय सिर्फ दो चयन करें और उन्हें एक साथ मिलाएं। आपको 1000x की गति पर समान परिणाम मिलते हैं।


मैंने यह अस्पष्ट व्यवहार देखा है।
एसेन

2

देखें कि कहां क्लॉज है - इंडेक्स के सत्यापन का उपयोग करें / सत्यापित करें कि कुछ भी मूर्खतापूर्ण नहीं किया जा रहा है

where SomeComplicatedFunctionOf(table.Column) = @param --silly

2

मैं आम तौर पर जॉन्स के साथ शुरू करूँगा - मैं उनमें से हर एक को क्वेरी से बाहर एक समय में दस्तक दूँगा और एक विचार प्राप्त करने के लिए क्वेरी को फिर से चला सकता हूं यदि कोई विशेष जॉइन है तो मुझे समस्या हो रही है।


2

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

declare @temp table(
    RowID int not null identity(1,1) primary key,
    SomeUniqueColumn varchar(25) not null,
    SomeNotUniqueColumn varchar(50) null,
    unique(SomeUniqueColumn)
)

2

मैंने इसे हमेशा बाइंड चर का उपयोग करने की आदत बनाई है। अगर RDBMS SQL स्टेटमेंट को कैश नहीं करता है तो यह संभव है कि बाइंड वैरिएबल मदद नहीं करेगा। लेकिन अगर आप बाइंड वेरिएबल्स का उपयोग नहीं करते हैं तो RDBMS के पास क्वेरी एक्जीक्यूटिव प्लान और पार्स किए गए एसक्यूएल स्टेटमेंट का पुन: उपयोग करने का मौका नहीं है। बचत भारी हो सकती है: http://www.akadia.com/services/ora_bind_variables.html । मैं ज्यादातर ओरेकल के साथ काम करता हूं, लेकिन Microsoft SQL सर्वर उसी तरह से काम करता है।

मेरे अनुभव में, यदि आप नहीं जानते कि आप बाइंड चर का उपयोग कर रहे हैं या नहीं, तो आप शायद नहीं हैं। यदि आपकी एप्लिकेशन भाषा उनका समर्थन नहीं करती है, तो ऐसा करने वाले को खोजें। कभी-कभी आप क्वेरी B के लिए बाइंड चर का उपयोग करके क्वेरी A को ठीक कर सकते हैं।

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

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

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


2

पहला कदम: प्रश्न निष्पादन योजना को देखें!
TableScan -> खराब
नेस्टेडलोप -> meh चेतावनी
नेस्टेलोप के पीछे TableScan -> DOOM!

सेट स्टैटिस्टिक्स IO ऑन
सेट स्टेटिस्टिक्स टाइम ऑन


2

(NoLock) का उपयोग करके क्वेरी चलाना मेरे स्थान पर बहुत मानक संचालन है। किसी को भी टेंस-ऑफ-गिगाबाइट्स टेबल्स पर दौड़ते हुए पकड़ा गया और उसके बिना इसे शूट किया गया।


2
इसका उपयोग विवेकपूर्ण तरीके से किया जाना चाहिए, न कि आदतन। ताला लगाना बुराई नहीं है, सिर्फ गलत समझा गया है।

2

यदि संभव हो तो बाईं ओर के प्रश्नों को प्रश्नों में न बदलें। उदाहरण के लिए यदि आप तालिका 1 में सभी पंक्तियों को खोजना चाहते हैं जो तालिका 2 में एक विदेशी कुंजी द्वारा अप्रयुक्त हैं तो आप ऐसा कर सकते हैं:

SELECT *
FROM Table1
WHERE Table1.ID NOT IN (
    SELECT Table1ID
    FROM Table2)

लेकिन आपको इससे बेहतर प्रदर्शन मिलेगा:

SELECT Table1.*
FROM Table1
LEFT OUTER JOIN Table2 ON Table1.ID = Table2.Table1ID
WHERE Table2.ID is null

1

@ डेविड एम

MySQL की मानें तो, क्वेरी के साथ क्या चल रहा है, यह जानने के लिए EXPLAIN का उपयोग करें, यह सुनिश्चित करें कि इंडेक्स का यथासंभव कुशलता से उपयोग किया जा रहा है ...

SQL सर्वर में, निष्पादन योजना आपको एक ही चीज़ मिलती है - यह बताता है कि अनुक्रमणिका क्या हिट हो रही हैं, आदि।


1

जिस तालिका को आप फ़िल्टर करते हैं, उस तालिका को अनुक्रमित करें


1

जरूरी नहीं कि एसक्यूएल परफॉर्मेंस ट्रिक प्रति एसई लेकिन निश्चित रूप से संबंधित हो:

एक अच्छा विचार यह होगा कि जहां संभव हो सके, मेमेकैच्ड का उपयोग करना होगा क्योंकि यह डेटाबेस से प्राप्त करने के बजाय मेमोरी से सीधे पहले से तैयार किए गए डेटा को प्राप्त करना अधिक तेज होगा। MySQL का एक फ्लेवर भी है जिसे मेमस्कैल्ड इन (थर्ड पार्टी) बनाया गया है।


1

सुनिश्चित करें कि आपकी अनुक्रमणिका की लंबाई यथासंभव छोटी है। यह DB को फ़ाइल सिस्टम से एक बार में अधिक कुंजियों को पढ़ने की अनुमति देता है, इस प्रकार आपके जुड़ने में तेजी लाता है। मुझे लगता है कि यह सभी DB के साथ काम करता है, लेकिन मुझे पता है कि यह MySQL के लिए एक विशिष्ट सिफारिश है।


1

मैं बाहर देखने के लिए:

  • किसी भी CURSOR लूप को अनियंत्रित करें और सेट आधारित UPDATE / INSERT कथनों में परिवर्तित करें।
  • किसी भी एप्लिकेशन कोड के लिए बाहर देखें:
    • एक SP को कॉल करता है, जो रिकॉर्ड का एक बड़ा सेट लौटाता है,
    • फिर आवेदन में, प्रत्येक रिकॉर्ड के माध्यम से जाता है और रिकॉर्ड अपडेट करने के लिए मापदंडों के साथ एक एसपी को कॉल करता है।
    • इसे एक एसपी में परिवर्तित करें जो सभी कार्यों को एक लेनदेन में करता है।
  • कोई भी SP जो बहुत सारे स्ट्रिंग हेरफेर करता है। यह सबूत है कि डेटा सही ढंग से संरचित / सामान्यीकृत नहीं है।
  • किसी भी एसपी के पहिए का फिर से आविष्कार।
  • किसी भी एसपी है कि मैं समझ नहीं सकता कि यह एक मिनट के भीतर क्या करने की कोशिश कर रहा है!

1
SET NOCOUNT ON

आमतौर पर मेरी संग्रहीत प्रक्रियाओं के अंदर पहली पंक्ति, जब तक कि मुझे वास्तव में उपयोग करने की आवश्यकता न हो @@ROWCOUNT


2
@@ रोवे वैसे भी सेट है। NOCOUNT "xx पंक्तियाँ प्रभावित" कथन अक्षम करता है।
स्किलीव्ज

क्या यह वास्तव में प्रदर्शन में एक सराहनीय अंतर है?
JohnFx

हाँ, तब गिनती स्वचालित रूप से हर बार गणना नहीं की जाती है जब एसक्यूएल स्टेटमेंट चलाया जाता है। यह बिना किसी क्वेरी के साथ और बिना देखे यह देखना काफी आसान है कि इससे कोई फर्क पड़ता है।
ट्रैविस

गणना को SQL सर्वर में वैसे भी ट्रैक किया गया है। कोई भी प्रदर्शन अंतर जो आप देखते हैं, क्योंकि काउंट्स को आपके सामने के छोर तक नेटवर्क पर जाना है। यदि आप एक एकल चयन कर रहे हैं तो यह एक प्रशंसनीय अंतर नहीं करेगा। यदि आपके पास 100000 आवेषण के साथ एक लूप है, तो यह नेटवर्क पर बहुत अतिरिक्त है।
टॉम एच

1

SQL सर्वर में, nolock निर्देश का उपयोग करें। यह प्रतीक्षा किए बिना चयन कमांड को पूरा करने की अनुमति देता है - आमतौर पर अन्य लेनदेन समाप्त करने के लिए।

SELECT * FROM Orders (nolock) where UserName = 'momma'

3
NOLOCK केवल उन प्रश्नों के लिए है जिनके लिए आप सही परिणामों की परवाह नहीं करते हैं
मार्क सोउल

1

जहाँ भी निंदक नहीं हैं, वहाँ से श्राप हटा दें।


हाँ, अभिशाप एक अभिशाप हैं! ;)
स्किलिव्ज़

8
ओह। उस तरह से अयोग्य घोषित मत करो। कर्सर बंदूक की तरह होते हैं। वे अपने आप से बुरा नहीं हैं, बस यह है कि लोग उनके साथ वास्तव में बुरा काम करते हैं।
JohnFx

1

फ़ंक्शन कॉल को Sprocs में निकालें जहाँ बहुत सारी पंक्तियाँ फ़ंक्शन को कॉल करेंगी।

मेरे सहयोगी ने बहुत व्यापक रिकॉर्ड वापस करने के लिए फ़ंक्शन कॉल का उपयोग किया (उदाहरण के रूप में उपयोगकर्ता से अंतिम रूप प्राप्त करना)।

अनुकूलन के साथ काम किया, मैंने फ़ंक्शन कॉल को फ़ंक्शन के कोड के साथ स्पोक में बदल दिया: मुझे कई स्प्रोक्स का समय> 20 सेकंड से <1 तक कम हो गया।


0
  • Dbo के साथ सभी तालिकाओं को उपसर्ग करें। पुनर्मूल्यांकन को रोकने के लिए।
  • तालिका / इंडेक्स स्कैन के लिए क्वेरी योजनाएं और शिकार देखें।
  • 2005 में, गायब अनुक्रमणिकाओं के लिए प्रबंधन के विचारों को परिमार्जन करें।


0

"Sp_" के साथ Stored Procedure नामों को पहले से न रखें क्योंकि सिस्टम प्रक्रियाएं सभी "sp_" से शुरू होती हैं, और SQL सर्वर को कॉल करने पर आपकी प्रक्रिया को खोजने के लिए कठिन खोज करनी होगी।


1
क्या आपने वास्तव में इसे बेंचमार्क किया था? यदि SQL सर्वर वह कर रहा है जो उचित है (संग्रहीत कार्यविधि का पता लगाने के लिए हैश एल्गोरिथ्म का उपयोग करके), तो इससे कोई अंतर नहीं पड़ेगा। वास्तव में अगर SQL सर्वर ऐसा नहीं कर रहा था , तो ऐसा लगता है कि सिस्टम का प्रदर्शन बदबू मारता है (क्योंकि यह संभवतः कॉल करता है यह खुद का प्रॉक्स है)।
जॉन स्टॉफ़र

1
मुझे लगता है कि यह समय से पहले अनुकूलन की बाल्टी में आता है। शायद लोगों के लिए भ्रम से बचने के लिए यह एक अच्छा अभ्यास है, लेकिन एक अनुकूलन टिप के रूप में ... D-
JohnFx

0

गंदा पढ़ता है -

set transaction isolation level read uncommitted

मृत तालों को रोकता है जहां लेनदेन अखंडता बिल्कुल आवश्यक नहीं है (जो आमतौर पर सच है)


1
हां, लेकिन इससे अजीब तरह के कीड़े हो सकते हैं जो बहुत मुश्किल से मिलते हैं।
जॉनसन

0

मैं हमेशा SQL Profiler (अगर यह बहुत सारे नेस्टिंग स्तरों के साथ एक संग्रहीत प्रक्रिया है) या क्वेरी निष्पादन योजनाकार (यदि यह बिना किसी नेस्टिंग के साथ कुछ SQL कथन है) पर जाता है। 90% समय आप इन दो उपकरणों में से एक के साथ समस्या को तुरंत पा सकते हैं।

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