2015-12-09 9 views
6

मेरे पास एक दिलचस्प स्थिति है। जब मैं माइक्रोसॉफ्ट एसक्यूएल सर्वर प्रबंधन स्टूडियो में रिमोट एसक्यूएल सर्वर पर एक क्वेरी चलाता हूं तो यह तेज़ (12 सेकंड) चलाता है, लेकिन जब मैं DbContext.Database.SqlQuery<EntityType>(script) का उपयोग करके एंटीटी फ्रेमवर्क में एक ही क्वेरी चलाता हूं तो इसमें 48 सेकंड लगते हैं।इकाई फ्रेमवर्क डेटा पढ़ने प्रदर्शन

मैंने set arithabort on सेटिंग करने का प्रयास किया। सेटिंग लागू हो गई लेकिन उसने प्रदर्शन को नहीं बदला। मैं क्वेरी निष्पादन योजनाएं प्रदान करने में सक्षम नहीं हूं, क्योंकि मेरे पास केवल SQL सर्वर पर सीमित अनुमतियां हैं। लेकिन मैं 100% कह सकता हूं कि यह प्रश्न मुद्दा नहीं है।

declare @t table (...) 
insert into @t 
select <long query> 

select top 1 * from @t 

@t चर 35k के बारे में अधिक पंक्तियां हैं:

इस क्वेरी पर विचार करें। निष्पादन समय ईएफ और एसएसएमएस में काफी समान हैं। लेकिन जब मैं top 1 हटा देता हूं तो अजीब चीज होने लगती है। एसएसएमएस में मुझे 10 सेकंड मिलते हैं, लेकिन ईएफ में लगभग 40 सेकंड।

मुझे लगता है कि यह छोटा प्रयोग गलत निष्पादन योजना चुनने और चीजों को धीमा करने के लिए SQL सर्वर की संभावना से इंकार कर सकता है।

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

तो मेरा अगला अनुमान नेटवर्क समस्याएं हैं। मैंने माइक्रोसॉफ्ट नेटवर्क मॉनिटर 3.4 और एसएसएमएस और ईएफ दोनों के लिए निगरानी नेटवर्क यातायात स्थापित किया। मुझे पता चलने वाली दिलचस्पी बात कुछ कारणों से छोटे आकार के कई पैकेट और ईएफ संस्करण में कुछ टीएलएस पैकेट भी हैं। एसएसएमएस संस्करण पैकेट आकार में अधिक स्थिर है और कोई टीएलएस पैकेट नहीं हैं।

तो सवाल यह है: क्या ईएफ संस्करण को गति देना संभव है? उन टीएलएस पैकेट क्या हैं, क्या उनसे छुटकारा पाना संभव है?

SSMS traffic EF traffic

अद्यतन
इकाई की रूपरेखा v6.1.3
नेट v4.5.1
एसक्यूएल सर्वर v10.50.2550.0
स्थानीय SQLExpress v12.0.4213.0
विंडोज 7 प्रो

अद्यतन

using (var connection = new SqlConnection(DbContext.Database.Connection.ConnectionString)) 
using (var cmd = new SqlCommand(script, connection)) 
{ 
    connection.Open(); 

    cmd.CommandType = CommandType.Text; 
    using (SqlDataReader reader = cmd.ExecuteReader()) 
    { 
     reader.Read(); 
     do 
     { 
     } while (reader.Read()); 
    } 
} 

इस कोड पैदावार समय के लिहाज से एक ही परिणाम।

उत्तर

3

मैंने कुछ शोध और प्रयोग किया है, और ऐसा लगता है कि कनेक्शन स्ट्रिंग के लिए packet size=32768 (यह अधिकतम आकार) विकल्प जोड़ने से लगभग एसएसएमएस स्तर तक गति बढ़ जाती है। दिलचस्प बात यह है कि मुझे प्राप्त होने वाले टीसीपी पैकेट उनके आकार में वृद्धि नहीं करते हैं।

मैंने अन्य कनेक्शन स्ट्रिंग विकल्पों के साथ भी प्रयोग किया है लेकिन किसी भी ध्यान देने योग्य गति में वृद्धि नहीं हुई है।

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