2009-03-31 9 views
5

बस मेरे एक सहयोगी से बात कर रहा हूं। वह कॉफी मशीन के रास्ते पर, अपने कदम में एक हॉप के साथ चल रहा था।धीमी प्रदर्शन करने वाली क्वेरी पर, आपका सबसे अच्छा SQL अनुकूलन क्या था?

मैंने उनसे पूछा, "घुमावदार 'चलने के साथ क्या है?" उन्होंने कहा, "मैंने बस दो घंटे लंबी क्वेरी को 40 सेकंड तक घटा दिया! यह बहुत अच्छा लगता है"।

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

लेकिन आखिरकार, वह गूंज रहा था।

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

+0

मुझे यह दो घंटे की लंबी क्वेरी देखना अच्छा लगेगा। – RavB

उत्तर

1

क्षमा करें, मुझे उस तरह की चीज़ से कोई चर्चा नहीं मिलती है, लेकिन ज्यादातर स्थितियां काफी बुनियादी रही हैं, प्रश्नों के प्रदर्शन की निगरानी कर रही हैं और उन्हें गति देने के लिए इंडेक्स जोड़ रही हैं।

अब कक्षा के भीतर डेटा संरचनाओं और एल्गोरिदम को बदलकर मैंने "वास्तविक" कोड की गति में वृद्धि की है, जहां मैं अपना buzz प्राप्त करता हूं (और काम पर प्रदर्शन सुधारों के लिए जाने-माने व्यक्ति को प्रतिष्ठित करता हूं)।

+0

एसक्यूएल के विपरीत "असली" कोड? इसका मतलब है। – Learning

+0

buzzing से संबंधित, मैं सहमत हूं, जब आप इसे लंबे समय से कर रहे हैं, तो भावना कम हो जाती है। – Ferdeen

+0

@Learning, एसक्यूएल को अपमानित करने का अर्थ नहीं था, यह सिर्फ इतना है कि यह ज्यादातर एक-लाइनर प्रश्नों से बना है जहां ऑप्टिमाइज़ेशन काफी सीधे आगे है। बड़े जटिल कोड-बेस ("असली") मुझे उपलब्धि की भावना देते हैं। – paxdiablo

1

iphone जो SQLite का उपयोग करता है पर हे, मैं सीधे डेटाबेस प्रसंस्करण समय से 40 सेकंड से 2 सेकंड के लिए विशेष लिखने लेनदेन के उपयोग के साथ कम हो ... मैं सुपर खुश कर इस

इस रूप में था मेरी एक एम्बेडेड डिवाइस पर एसक्यूएल का पहला अनुभव - सामान्य सर्वर से संबंधित सामान (इंडेक्स, सामान्यीकरण इत्यादि) से काफी अलग

--- जहां तक ​​सर्वर जाते हैं, इंडेक्स वास्तविक आशीर्वाद हैं। यदि आप थोड़ा दर्द लेते हैं और अपनी मेज में जितने नल के रूप में छुटकारा पा सकते हैं, तो आप प्रदर्शन लाभ से आश्चर्यचकित होंगे - कई डेवलपर्स नल पर ध्यान केंद्रित नहीं करते हैं, वे आमतौर पर इंडेक्स और अन्य दस्तावेज सामग्री

के साथ जाते हैं

कुछ अन्य कम शोषित तरीकों - एकाधिक बैच आवेषण/अपडेट/हटाए जाने के लिए एक्सएमएल का उपयोग एक समय में 1 डालने के बजाय 1 एसएलएल 2005 में - यह बहुत अच्छा हो सकता है

6

मुझे यह कहना है कि मैंने कैसे सीखा कवर इंडेक्स बनाने और उपयोग करने के लिए। अब, कि एक प्रदर्शन बूस्टर था।

+0

+1 जब सही तरीके से उपयोग किया जाता है, तो यह प्रदर्शन में अद्भुत सुधार प्रदान कर सकता है –

+0

मुझे कवर किए गए इंडेक्स के बारे में पता नहीं था - मैंने अभी उनके बारे में एक लेख पढ़ा है और तकनीक को आजमाने के लिए इंतजार नहीं कर सकता! (मैं Ferds मूल प्रश्न में 'मेरे कदम में हॉप के साथ सहयोगी' ;-)) –

+0

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

3

खराब लिखित, कर्सर से लेटे हुए प्रश्न को लेना और कर्सर को खत्म करना, आधे से कोड को काटना और प्रदर्शन को कई गुना सुधारना हमेशा अच्छा होता है।

कुछ बेहतरीन सुधार स्पष्टता में हैं (और अक्सर अच्छे प्रदर्शन में भी वृद्धि होती है)।

+0

बस एक और सवाल के बारे में सोचा - कर्सर उपयोगी कब हैं? हर कोई उन्हें कुछ और इष्टतम में फिर से कारक लगता है। – Ferdeen

+0

ने यह पाया http://stackoverflow.com/questions/287445/why-do-people-hate-sql-cursors-so-much – Ferdeen

5

का उपयोग एसक्यूएल के BULKIMPORT विरासत INSERT कोड के कई घंटों को एक मिनट से भी कम समय तक कम करने के लिए।

1

यह सब इंडेक्स के बारे में है। और बेवकूफ चीजों से परहेज जो उन्हें बेकार बनाते हैं।

+0

समस्या कुंजीपटल और कुर्सी के बीच है! – Sam

0

अच्छी तरह से हमारे पास एक समान चीज़ थी जहां ओपन फ्रीवे साइट पर हमारी धीमी क्वेरी थी।उत्तर क्वेरी को इतना अनुकूल नहीं था, लेकिन सर्वर को अनुकूलित करने के लिए यह चालू था। हमने कैश सीमा और कैश आकार बढ़ाया ताकि सर्वर अक्सर क्वेरी नहीं चलाएगा।

इसने सिस्टम की गति में बड़े पैमाने पर वृद्धि की है और आखिरकार ग्राहक को खुश कर दिया है! :)

मूल पोस्ट अनुकूलन कौशल की काफी क्षमता नहीं है, लेकिन यह निश्चित रूप से हमें चर्चा करता है!

0

एक हास्यास्पद रूप से लंबी संग्रहीत प्रक्रिया को विभाजित करना, जिसने "5 बजे के बाद, एसबीएल के इस बिट को वापस कर दिया" का एक बड़ा सौदा किया और जो संग्रहीत प्रक्रियाओं के एक सेट में चलाने के लिए 20 सेकंड से अधिक समय ले गया एक नियंत्रित एसपी द्वारा, और प्रतिक्रियाओं को उपसेकंद करने के लिए समय नीचे मिल गया।

1

WHERE क्लॉज के अंदर स्थितियों के क्रम को बदलने से पहले यह सबसे अधिक भेदभाव वाली स्थिति को फ़िल्टर करता है (जबकि साथ ही लिंग जैसे गैर-भेदभाव वाले कॉलम से इंडेक्स हटा दिए जाते हैं)।

+0

क्वेरी ऑप्टिमाइज़र आपके लिए यह करना चाहिए .. यह किस इंजन पर था? – Brimstedt

+0

आप किस डीबीएमएस का उपयोग कर रहे हैं? यदि आपका ऑप्टिमाइज़र ठीक से अपना काम कर रहा है तो आपको WHERE शर्तों को मैन्युअल रूप से फिर से ऑर्डर करने की आवश्यकता नहीं है। – LukeH

+1

एमएस एसक्यूएल 2000. वैसे भी, यह न देखें कि इंजन इसे कैसे अनुकूलित कर सकता है। यदि आप कुछ एक्सप्रेशन के शोर-सर्किट मूल्यांकन चाहते हैं और आपको ऐसा कोड लिखना चाहिए जो ऐसा करता है। यहां तक ​​कि शोर-सर्किटिंग नहीं होने पर, यदि सर्वर एक ही प्रकार के होते हैं तो सर्वर कैसे जान सकता है कि कौन सा क्षेत्र अधिक भेदभावपूर्ण है? – Dan

0

एक शब्द, गतिशील प्रश्नों

आप मानकों की बड़ी संख्या को आप एसक्यूएल स्ट्रिंग से उन्हें छूट सकते हैं के साथ serching हैं। इसने नाटकीय रूप से और पुनः प्राप्त आसानी से मेरे प्रश्नों को बढ़ा दिया है।

Create PROCEDURE dbo.qryDynamic 
( 

@txtParameter1 nvarchar(255), 
@txtParameter2 nvarchar(255), 

AS 
SELECT  qry_DataFromAView.* 
FROM   qry_DataFromAView 
BEGIN 

    DECLARE @SQL nvarchar(2500) 
    DECLARE @txtJoin nvarchar(50) 

    Set @txtJoin = ' Where ' 

    SET @SQL = 'SELECT  qry_DataFromAView.* 
       FROM   qry_DataFromAView' 

    IF @txtParameter1 is not null 
    Begin 
     SET @[email protected] + @txtJoin + ' Field1 LIKE N''%'' + @dynParameter1 + N''%'') ' 
     Set @txtJoin = ' And ' 
    end 


    IF @txtParameter2 is not null 
    Begin 
     SET @[email protected] + @txtJoin + ' Field2 LIKE N''%'' + @dynParameter2 + N''%'') ' 
     Set @txtJoin = ' And ' 
    end 

    SET @[email protected] + ' ORDER BY Field2' 


    Exec sp_executesql @SQL, N'@dynParameter1 nvarchar(255), @dynParameter2 nvarchar(255)', @dynParameter1 = @txtParameter1 ,@dynParameter2 = @txtParameter2 

END 
GO 
1

दिन में, मैंने सीओसीओएल में लिखित सीआईसीएस/डीबी 2 प्रणाली पर काम किया। हमारे बहुत सारे प्रश्न पूर्ण तालिका स्कैन (और धीमे) कर रहे थे, भले ही हमारे पास सभी उचित इंडेक्स और WHERE खंड थे।

यह पता चला (और मैं इस पीछे की ओर हो सकता है, यह 15 साल हो गया है) कि समस्या यह है कि हम क्वेरी पैरामीटर के लिए WORKING STORAGE में PIC S9(n) COMP उपयोग कर रहे थे था, लेकिन डीबी 2 PIC S9(n) COMP-3 चाहता था। गलत डेटा प्रकार का उपयोग करके, डीबी 2 को डेटाबेस में मानों को उस मूल्य में रूपांतरित करने के लिए एक पूर्ण तालिका स्कैन करना था, जिसमें हमने गुजर रहे थे। हमने अपनी परिवर्तनीय परिभाषाओं को बदल दिया और प्रश्न अब इंडेक्स का उपयोग करने में सक्षम थे, जो नाटकीय रूप से हमारे प्रदर्शन में सुधार हुआ।

0

मैं प्रसंस्करण और लुकअप की अधिक संख्या (तकनीकी शब्द) स्क्रैप करने के लिए एक क्रॉस टैब क्वेरी का उपयोग करने में सक्षम होने के बाद एक गर्म चमक था ...

आमतौर पर यह अनुक्रमित जोड़ने या केवल डेटा आप की जरूरत हो रही है की तरह साधारण चीजें है , लेकिन जब आपको कोई ऐसी समस्या मिलती है जो आपके द्वारा पहले देखा गया उत्तर देता है ... अच्छे समय!

0

(विषय के आधा रास्ता)

मैं में LINQ2SQL/सी # एक 3000 लाइन संग्रहीत प्रक्रिया दुबारा लिखा। संग्रहीत प्रक्रिया अनइंडेड अस्थायी temp तालिकाओं के समूह के बीच बहुत सारे डेटा juggled। LINQ2SQL संस्करण डेटा को कुछ शब्दकोश और ILookups में पढ़ता है और फिर मैं सादे पुराने सी # कोड के साथ मैन्युअल रूप से डेटा में शामिल हो गया।

संग्रहित प्रक्रिया में लगभग 20 सेकंड लग गए और LINQ2SQL/C# संस्करण में 0.2 सेकंड लगे।

1

मैं एक प्रश्न है कि मूल रूप एसक्यूएल सर्वर 6.5 के लिए लिखा गया था, जो एसक्यूएल 92 वाक्य रचना में शामिल होने का समर्थन नहीं किया, यानी था

select foo.baz 
from foo 
    left outer join bar 
    on foo.a = bar.a 

बजाय के रूप में

select foo.baz 
from foo, bar 
where foo.a *= bar.a 

क्वेरी किया गया था लिखा गया था थोड़ी देर के लिए, और प्रासंगिक डेटा को धीमा चलाने के लिए संचित किया गया था, पूरा करने के लिए 90 सेकंड के करीब।जब तक यह समस्या उत्पन्न हुई, हमने SQL सर्वर 7 में अपग्रेड किया था।

इंडेक्स और अन्य ईस्टर-अंडे के साथ मिलकर, मैंने सिंटैक्स को SQL 92 अनुपालन के रूप में परिवर्तित करने के बाद बदल दिया। क्वेरी समय 3 सेकंड तक गिर गया।

मुझे नहीं लगता कि मुझे कभी यह महसूस होगा। मैं एक एफ $ $ आईएनजी नायक था।

+0

एसक्यूएल सर्वर 6.5 ने बाएं बाहरी जुड़ने का समर्थन किया। जैसा कि रॉन सॉकअप (एसक्यूएल सर्वर प्रोग्राम मैनेजर) द्वारा उद्धृत किया गया है: "संस्करण 6.5 से पहले, एसक्यूएल सर्वर ने विशेष ऑपरेटरों * = और = * के रूप में बाहरी-शामिल समर्थन सीमित कर दिया था। कई लोगों ने एसक्यूएल के बाएं बाहरी जॉइन सिंटैक्स को माना है सर्वर 6.5 बस * = के लिए समानार्थी है, लेकिन यह मामला नहीं है। बाएं बाहरी जॉइन अर्थात् अलग से * * से बेहतर है। –

+0

अब यह SQL-92 वाक्यविन्यास को अपनाने के लिए एक उचित मामला है। आखिरकार! – Sam

संबंधित मुद्दे

 संबंधित मुद्दे