2009-03-19 15 views
6

मैं क्वेरी को क्रियान्वित किया है की धीरे प्रदर्शन ~ MSSMS में 2 सेकेंड (पंक्तियों की 25K लौटने)SqlDataReader

ही .NET (sqlReader) कुछ ही मिनटों exetuting में इस्तेमाल किया क्वेरी!

मैं भी केवल पाठक पर अमल करने की कोशिश की है

(जबकि अभी reader.Read छोड़ने पाश में सभी कोड() टिप्पणी की) - अब भी वही!

कोई विचार क्या हो रहा है?

+0

क्या आप कुछ कोड पोस्ट कर सकते हैं? –

+0

क्या एसक्यूएल क्वेरी प्रोफाइलर इस मुद्दे के बारे में कोई संकेत बताता है? –

+0

ईजेबी: कोड पोस्ट करने के लिए तैयार नहीं है। मैं डीबीए नहीं कर रहा हूँ और प्रोफाइलर के बारे में ज्यादा जानकारी नहीं है: समस्या ही हम भी शुद्ध का उपयोग निष्पादित पाठक आदेश (एमएस मदद में तो उपलब्ध) – Maciej

उत्तर

2

मैं डीबीए नहीं हूं और प्रोफाइलर के साथ खेलने के लिए निजीकृत नहीं हूं - मेरे डीबीए से पूछेगा और सभी को बताएगा।

इस बीच में मैं "RECOMPILE साथ " जोड़ने के बाद देखा आवश्यक प्रदर्शन को बढ़ावा देने हूँ परम सपा के लिए मैं

बात कर रहा हूँ तो, मेरे नजरिए से यह कार्य योजना लागू के साथ मामला प्रतीत हो रहा है ... आपको क्या लगता है?

[संपादित करें] इसके अलावा, मैं क्यूए और .NET

से क्वेरी के नीचे प्रदर्शन कर रहा था
select @@options 

मेरे समझ यह दोनों environements के लिए समान मान जाएगा क्या देख लिया है। (यदि differnet ex.plans का उपयोग नहीं किया जाएगा) क्या मैं सही हूँ?

[EDIT2] मैं (http://www.sqldev.net/misc/fn_setopts.htm से) पढ़ा है ARITHABOIRT = पर क्यूए में (.NET में बंद है)

enybody कैसे ARITHABOIRT पर = हर के लिए मजबूर करने के लिए जानती है कि। नेट कनेक्शन?

+3

@Maciej - ExecuteReader को कॉल करने से पहले आप अपने कनेक्शन ऑब्जेक्ट का उपयोग करके उस पाठ के साथ एक कमांड निष्पादित करके अभिषेक सेट कर सकते हैं। सेट विकल्प उस कनेक्शन के जीवन के लिए प्रभावी होगा। –

+0

वही मेरे साथ हुआ। एसपी अंधेरा अंधेरा, .NET से कॉल हमेशा के लिए ले रहा था। मैंने SET ARITHABORT = ON जोड़ा है और सब कुछ जादुई रूप से तेज़ हो गया है ... – abx78

0

मैं यह देखने के लिए जांच करूंगा कि वास्तविक पुनर्प्राप्ति कितनी देर तक चल रही है।

उदाहरण के लिए

:

Private Sub timeCheck() 
    'NOTE: Assuming you have a sqlconnection object named conn 

    'Create stopwatch 
    Dim sw As New System.Diagnostics.Stopwatch 

    'Setup query 
    Dim com As New SqlClient.SqlCommand("QUERY GOES HERE", conn) 

    sw.Start() 

    'Run query 
    Dim dr As SqlClient.SqlDataReader = com.ExecuteReader() 

    sw.Stop() 

    'Check the time 
    Dim sql_query_time As String = CStr((sw.ElapsedMilliseconds/1000)) & " seconds" 
    End Sub 

इससे आपको यह देखने के लिए कि क्या होल्ड-अप पुनर्प्राप्ति में है, या पाठक के निष्पादन में की अनुमति देगा।

0

आप एक पाश, जहां यह कई बार निष्पादित करता है में पाठक को क्रियान्वित करने की गिरफ्तारी, तो सुनिश्चित करें कि आप CommandBehavior.CloseConnection

SqlCommand cmd = new SqlCommand(); 
    SqlDataReader rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection) 

उपयोग कर रहे हैं आप नहीं, हर बार लूप लाइन प्रक्रियाओं रहे हैं तो करते हैं, जब यह खत्म हो जाता है और आरडीआर और कनेक्शन ऑब्जेक्ट गुंजाइश से बाहर हो जाता है, तो कनेक्शन ऑब्जेक्ट स्पष्ट रूप से बंद नहीं किया जाएगा, इसलिए यह केवल बंद हो जाएगा और पूल पर वापस जारी किया जाएगा जब कचरा कलेक्टर आखिरकार इसे अंतिम रूप देने के लिए हो जाता है ...

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

इस अतिरिक्त विलंबता और देरी का कारण होगा (पूल एक अधिकतम सीमा यह उत्पन्न कर सकते हैं है) जो उनका उपयोग कर रहा है ...

+0

मूल प्रश्न केवल एक प्रश्न को चलाने का उल्लेख करता है जो उम्र लेता है, एसक्यूएलकनेक्शन ऑब्जेक्ट्स के बहुत सारे बनाने और प्रश्नों के बहुत से निष्पादन के बारे में कुछ भी नहीं है। – sisve

+5

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

+0

मुझे लगता है कि साइमन का अर्थ क्या है कि यह अच्छा होगा अगर सुझाए गए उत्तर के मूल प्रश्न के साथ कुछ करना था। वह सही है, मूल प्रश्न के कनेक्शन के साथ कुछ लेना देना नहीं है, इसे कोड के साथ निष्पादित कोड के साथ करना है। रीड() लूप, जिसका अर्थ है कि केवल एक कनेक्शन है। तो तकनीकी रूप से आपने कुछ गलत कहा था, जिसमें आपने एक प्रश्न का उत्तर दिया था जिसे नहीं पूछा गया था। –

4

मैं एसक्यूएल सर्वर प्रोफाइल से कनेक्ट करते समय एसईटी विकल्प सेटिंग्स कनेक्शन का उपयोग कर रहा है, और एसएसएमएस में कौन सी सेटिंग्स का उपयोग किया जा रहा है, यह देखने के लिए एसक्यूएल सर्वर प्रोफाइलर में एक ट्रेस सेट अप करेगा। सेट विकल्प सेटिंग करके, मेरा मतलब है

ARITHABORT 
ANSI_NULLS 
CONCAT_NULL_YIELDS_NULL 
//etc 

मैं इस समस्या को देखा है विकल्पों में से एक मेज के लिए MSDN पर एक नजर डालें से पहले जहां विकल्प (, ARITHABORT कि मामले में) अलग थे और प्रदर्शन अंतर विशाल था

0

इसके अलावा, क्वेरी विश्लेषक बड़े टेक्स्ट या बड़े बाइनरी फ़ील्ड की पूरी सामग्री डाउनलोड नहीं करता है। आपके SqlDataReader में अधिक समय लग सकता है क्योंकि यह पूर्ण सामग्री डाउनलोड करता है।

3

मैं करने के लिए है कि समस्या थी। डीबी सर्वर की कनेक्शन सेटिंग्स में "अंकगणित निरस्त" सेटिंग पर निशान लगाएं।

+0

आपके मामले में इस विकल्प को चेक या अनचेक करने में मदद मिली? + MyCommand.CommnadText; – Maciej

+0

आप इसे हां, 'MyCommand.CommnadText =" ARITHABORT पर सेट ", की तरह से चालू करना चाहें' – JasonRShaver

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