इकाई की रूपरेखा Arithabort पर है, लेकिन अभी भी क्वेरी धीमी है

0

सवाल

मैं एक साधारण क्वेरी

var count =  await _context.ExchangeRate.AsNoTracking().CountAsync(u => u.Currency == "GBP");

इस तालिका में केवल 3 कॉलम और 10 पंक्तियों में डेटा.

जब मैं करने की कोशिश की निष्पादित करने के लिए क्वेरी को नेट से 5 परियोजना यह ले जा रहा है के आसपास 2.3 सेकंड के लिए पहली बार और 500ms (+- 100) के लिए बाद में अनुरोध. मैं मारा जब एक ही अनुरोध में SSMS यह लौट रहा है लगभग कोई समय में (45ms में देखा के रूप में sql profiler).

मैं लागू किया है ARITHABORT में एफई से यहाँ

जब मैं देख रहा हूँ में SQL Profiler यह सेटिंग ARITHABORT पर लेकिन अभी भी क्वेरी लेता है एक ही समय में पहली बार के लिए अनुरोध करता है और बाद के अनुरोध के साथ.

sql profiler screen shot

कैसे क्या मैं प्राप्त की गति के रूप में एक ही SSMS क्वेरी गति. मैं की जरूरत है इस क्वेरी को चलाने के लिए वास्तव में गति के रूप में मेरा परियोजना के लिए की आवश्यकता वापसी के जवाब में 1 दूसरा (की जरूरत है बनाने के लिए कम से कम 5 सरल DB कॉल...अगर 1 कॉल लेता है 500ms तो यह है पार 1 सेकंड की आवश्यकता है)

संपादित करें

के साथ की कोशिश की यहां तक कि ADO.Net. निष्पादन समय ले लिया है के रूप में देखा SQL Profiler है 40ms, जहां के रूप में जब यह तक पहुँच कोड यह लगभग 400ms. इतना अंतर

        using (var conn = new SqlConnection(connectionString))
        {
            var sql = "select count(ExchangeRate) as cnt from ExchangeRate  where Currency = 'GBP'";

            SqlCommand cmd = new SqlCommand();

            cmd.CommandText = "SET ARITHABORT ON; " + sql;
            cmd.CommandType = CommandType.Text;
            cmd.Connection = conn;
            conn.Open();
            var t1 = DateTime.Now;
            var rd =  cmd.ExecuteReader();
            var t2 = DateTime.Now;
            TimeSpan diff = t2 - t1;

           Console.WriteLine((int)diff.TotalMilliseconds);
          
          while (rd.Read())
          {
               Console.WriteLine(rd["cnt"].ToString());
          }
            conn.Close();
        }
1

सबसे अच्छा जवाब

0

अपने "सबसे पहले भागो" परिदृश्य है आम तौर पर एक स्थिर आरंभीकरण के DbContext. यह है जहाँ DbContext बाहर काम करता है, इसकी मैपिंग के लिए पहली बार घटित होगा जब पहली क्वेरी निष्पादित होता है । ठेठ दृष्टिकोण से बचने के लिए होने वाली इस के लिए एक उपयोगकर्ता के लिए है एक सरल "गर्म" क्वेरी चलाता है कि जब सेवा शुरू होता है.. उदाहरण के लिए, के बाद अपने सेवा initializes, सीधे शब्दों में कहें, निम्नलिखित की तरह कुछ:

// Warm up the DbContext
using (var context = new AppDbContext())
{
    var hasUser = context.Users.Any();
}

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

के लिए के रूप में कच्चे प्रदर्शन, अगर यह नहीं है कि एक प्रश्न लेने की उम्मीद है, जबकि एक टाई और एक अनुरोध है, नहीं यह async. अतुल्यकालिक अनुरोध कर रहे हैं नहीं तेजी से, वे कर रहे हैं वास्तव में थोड़ा धीमी है. का उपयोग कर async अनुरोधों के खिलाफ DbContext के बारे में है यह सुनिश्चित करने के अपने वेब सर्वर / आवेदन धागा उत्तरदायी है, जबकि संभावित महंगा डेटाबेस के संचालन कर रहे हैं प्रसंस्करण. यदि आप चाहते हैं एक प्रतिक्रिया के रूप में जल्दी संभव के रूप में, का उपयोग एक तुल्यकालिक कॉल.

अगले, सुनिश्चित करें कि किसी भी क्षेत्र में आप कर रहे हैं छानने के खिलाफ, इस मामले में, मुद्रा अनुक्रमित रहे हैं. होने के एक क्षेत्र कहा जाता है मुद्रा में अपनी इकाई के रूप में एक स्ट्रिंग के बजाय एक CurrencyId FK (int) की ओर इशारा करते के लिए एक मुद्रा का रिकॉर्ड पहले से ही एक अतिरिक्त अनुक्रमण के खर्च के रूप में अनुक्रमित पूर्णांकों पर छोटे होते हैं/तेजी से उन पर तार.

आप भी करने की जरूरत नहीं है के साथ परेशान AsNoTracking जब का उपयोग कर एक Count क्वेरी. AsNoTracking पूरी तरह से लागू होता है जब आप लौट रहे हैं संस्थाओं (ToList/ToArray/Single/Firstआदि.) करने के लिए होने से बचने के DbContext पर पकड़ के लिए एक संदर्भ लौटे इकाई है । जब आप का उपयोग Count/Any या प्रक्षेपण के लिए लौटने से गुण संस्थाओं का उपयोग कर Select वहाँ है कोई इकाई नहीं लौटे ट्रैक करने के लिए.

यह भी विचार विलंबता नेटवर्क के बीच कहाँ अपने आवेदन कोड चल रहा है और डेटाबेस सर्वर. वे कर रहे हैं एक ही मशीन या वहाँ एक नेटवर्क कनेक्शन खेलने में? कैसे करता है यह तुलना जब आप प्रदर्शन कर रहे हैं एक SSMS क्वेरी? का उपयोग कर एक profiler आप देख सकते हैं क्या SQL एफई वास्तव में भेजने के लिए डेटाबेस । बाकी सब के संदर्भ में समय की लागत है: हो रही करने के लिए अनुरोध DB हो रही है, जिसके परिणामस्वरूप डेटा वापस निवेदक के लिए, पार्स है कि प्रतिक्रिया है । (यदि मामले में आप कर रहे हैं जहां लौटने संस्थाओं के आवंटन,, populating, जाँच खिलाफ मौजूदा संदर्भ, आदि... के मामले में मायने रखता है आदि । जाँच के मौजूदा संदर्भ)

अन्त में, सुनिश्चित करने के लिए कर रहे हैं और चोटी के प्रदर्शन, सुनिश्चित करें कि आपके DbContexts जन्मों रखा जाता है । यदि एक DbContext को खुला रखा जाता है और किया गया है की संख्या पर नज़र रखने के प्रश्नों के खिलाफ चलाने में (का चयन संस्थाओं के बिना AsNoTracking) उन पर नज़र रखी इकाई के संदर्भ में जमा कर सकते हैं और एक नकारात्मक प्रदर्शन प्रभाव पर भविष्य के प्रश्नों, यहां तक कि अगर आप का उपयोग AsNoTracking के रूप में एफई लग रहा है की जाँच करने के लिए के माध्यम से यह पता लगाया संदर्भ के लिए है कि संस्थाओं पर लागू हो सकती/संबंधित करने के लिए अपने नए प्रश्नों. कई बार मैं देख रहा हूँ डेवलपर्स मान DbContexts कर रहे हैं "महंगा" तो वे चुनते इन्स्तांत के लिए उन्हें के रूप में छोटे रूप में संभव से बचने के लिए उन लागत, केवल अंत करने के लिए बनाने के संचालन और अधिक महंगी समय के साथ ।

सभी के साथ कि माना जाता है, एफई होना कभी नहीं होगा के रूप में उपवास के रूप में कच्चे SQL. यह एक ORM प्रदान करने के लिए डिजाइन के लिए सुविधा .नेट अनुप्रयोगों के लिए जब यह आता है काम करने के लिए डेटा के साथ. है कि सुविधा के साथ काम करने में इकाई वर्गों के बजाय sanitizing और अपने खुद के लेखन के कच्चे SQL हर समय लागत के साथ आता है.

2021-11-23 21:59:24

के रूप में दूर के रूप में अपनी टिप्पणी के बारे में नेटवर्क विलंबता दोनों SSMS और नेट कोड है मेरे मशीन में..db सर्वर में...और अन्य बातों के लिए मैं केवल एक क्वेरी (यह एक पीओसी). इतना के साथ एक ही नेटवर्क विलंबता SSMS में सक्षम है करने के लिए लाने में 40ms, जहां के रूप में शुद्ध कोड ले जा रहा है 500ms.....यहां तक कि के साथ की कोशिश की ADO.NET में देखा के रूप में सवाल है, दोनों ले रहे हैं 500ms
CrazyMonk

अन्य भाषाओं में

यह पृष्ठ अन्य भाषाओं में है

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................

इस श्रेणी में लोकप्रिय

लोकप्रिय सवाल इस श्रेणी में