2012-03-06 15 views
5

मैं एमएसक्यूएल के साथ एंटीटी फ्रेमवर्क बनाम हमारे डीबी बैकएंड के लिए रावेनडीबी का उपयोग करके तुलना करने के लिए एक परीक्षण चला रहा हूं।RavenDb प्रदर्शन समस्या?

मेरे पास जांच करने के लिए मेरा परीक्षण ऐप सेटअप है और देखें कि क्या RavenDB में स्टार्टअप पर कोई दस्तावेज़ है, और यदि ऐसा नहीं होता है, तो यह सभी ऑब्जेक्ट्स (लगभग 31,000 आइटम) प्राप्त करने के लिए एंटीटी फ्रेमवर्क के माध्यम से SQL डेटाबेस से पूछताछ करता है और फिर उन्हें RavenDB में डालें। यह हिस्सा अपेक्षित के रूप में काम कर रहा है।

फिर मैं परीक्षण चलाता हूं। मैं रिकॉर्ड के एक सेट के लिए ईएफ के खिलाफ पूछता हूं और उन्हें JSON में परिवर्तित करता हूं, और रावेन के साथ दोहराता हूं (रिकॉर्ड्स का सटीक सेट प्राप्त करना)। मुझे उम्मीद थी कि रावेन तेजी से होगा, क्योंकि इसे पढ़ने के लिए अनुकूलित किया गया है, और डेटा को वापस पाने के लिए ईएफ को दो तालिकाओं में शामिल होना है। लेकिन मामला वह नहीं है।

यहाँ परीक्षण से उत्पादन होता है:

protected void Page_Load(object sender, EventArgs e) 
     { 

      int totalTests = 25; 


      DataTable dt = new DataTable(); 
      dt.Columns.Add("Entity Framework with MS SQL"); 
      dt.Columns.Add("RavenDB"); 
      dt.Columns.Add("Percent Difference Raven to EF"); 

      for (int i = 1; i <= totalTests; i++) 
      { 

       string efMilliseconds = string.Empty; 
       string ravenMilliseconds = string.Empty; 

       double efMS = 0; 
       double ravenMS = 0; 

       // EF 
       using (tamcEntitiesForRavenTest myObjectContext = new tamcEntitiesForRavenTest()) 
       { 
        DateTime startTime = DateTime.Now; 
        List<Treatment> efTreatments = myObjectContext.Treatments.Include("Segments").Where(x => x.Jurisdiction == "00145").OrderBy(x => x.Treatment_Date).ToList(); 
        string json = JsonConvert.SerializeObject(efTreatments); 
        TimeSpan TotalTime = DateTime.Now - startTime; 
        efMS = TotalTime.TotalMilliseconds; 
        efMilliseconds = string.Format("{0} ms ({1} records)", efMS.ToString(), efTreatments.Count); 
       } 

       // Raven 
       using (var session = DataDocumentStore.Instance.OpenSession()) 
       { 
        DateTime startTime = DateTime.Now; 
        List<RavenTreatment> ravenTreatments = session.Query<RavenTreatment>().Where(x => x.Jurisdiction == "00145").OrderBy(x => x.Treatment_Date).Take(1000).ToList(); 
        string json = JsonConvert.SerializeObject(ravenTreatments); 
        TimeSpan TotalTime = DateTime.Now - startTime; 
        ravenMS = TotalTime.TotalMilliseconds; 
        ravenMilliseconds = string.Format("{0} ms ({1} records)", ravenMS.ToString(), ravenTreatments.Count); 
       } 

       DataRow dr = dt.NewRow(); 
       dr[0] = efMilliseconds; 
       dr[1] = ravenMilliseconds; 
       double percentDifference = (ravenMS * 100)/efMS; 
       dr[2] = percentDifference; 

       dt.Rows.Add(dr); 
      } 

      GridView1.DataSource = dt; 
      GridView1.DataBind(); 
     } 

मैं RavenDB उदाहरण एसक्यूएल सर्वर के रूप में एक ही मशीन पर चल रहा है:

Entity Framework with MS SQL RavenDB Percent Difference Raven to EF 
796.8954 ms (862 records) 1703.1686 ms (862 records) 213.725490196078 
296.8826 ms (862 records) 796.8954 ms (862 records) 268.421052631579 
281.2572 ms (862 records) 781.27 ms (862 records) 277.777777777778 
281.2572 ms (862 records) 796.8954 ms (862 records) 283.333333333333 
296.8826 ms (862 records) 765.6446 ms (862 records) 257.894736842105 
312.508 ms (862 records) 765.6446 ms (862 records) 245 
296.8826 ms (862 records) 750.0192 ms (862 records) 252.631578947368 
296.8826 ms (862 records) 750.0192 ms (862 records) 252.631578947368 
359.3842 ms (862 records) 765.6446 ms (862 records) 213.04347826087 
281.2572 ms (862 records) 765.6446 ms (862 records) 272.222222222222 
281.2572 ms (862 records) 796.8954 ms (862 records) 283.333333333333 
281.2572 ms (862 records) 765.6446 ms (862 records) 272.222222222222 
281.2572 ms (862 records) 812.5208 ms (862 records) 288.888888888889 
265.6318 ms (862 records) 781.27 ms (862 records) 294.117647058824 
296.8826 ms (862 records) 796.8954 ms (862 records) 268.421052631579 
281.2572 ms (862 records) 765.6446 ms (862 records) 272.222222222222 
281.2572 ms (862 records) 828.1462 ms (862 records) 294.444444444444 
281.2572 ms (862 records) 781.27 ms (862 records) 277.777777777778 
328.1334 ms (862 records) 750.0192 ms (862 records) 228.571428571429 
296.8826 ms (862 records) 750.0192 ms (862 records) 252.631578947368 
312.508 ms (862 records) 781.27 ms (862 records) 250 
296.8826 ms (862 records) 796.8954 ms (862 records) 268.421052631579 
281.2572 ms (862 records) 765.6446 ms (862 records) 272.222222222222 
312.508 ms (862 records) 781.27 ms (862 records) 250 
281.2572 ms (862 records) 734.3938 ms (862 records) 261.111111111111 

यहाँ परीक्षण चलाने के लिए इस्तेमाल किया कोड है ।

क्या यह अपेक्षित प्रदर्शन परिणाम है? या क्या मैं कुछ गलत कर रहा हूं।

+0

क्या आप कहां(), ऑर्डरबी(), और टेक() IQueryable हैं? क्या आप फ़िल्टरिंग को रावेन पर होने देते हैं, या आप सभी पंक्तियों को वापस ले रहे हैं और स्मृति में फ़िल्टर कर रहे हैं? –

+0

मैं इस धारणा के तहत था कि रावेन मेरे कहां और आदेश को सर्वर पर ले जाएगा और ले जाएगा। जब यह चलता है, तो मैं देखता हूं कि क्लॉज द्वारा कहां और क्रम के लिए एक temp अनुक्रमणिका बनाएं, तो ऐसा लगता है कि यह सर्वर पर चल रहा है। –

+2

ओह, उन इंडेक्स को स्पष्ट करें यदि आप जानते हैं कि आप उनका उपयोग करेंगे। इस तरह आप उन्हें बनाने से प्रदर्शन हिट नहीं होगा। (प्रदर्शन में एक चर हटा देता है) – Rangoric

उत्तर

7

अमांडा, आपको यह समझने की आवश्यकता है कि यह RavenDB स्वयं नहीं है जो एसक्यूएल सर्वर से तेज़ है। एमएसएसक्यूएल कई वर्षों से बाहर रहा है और आप यह सुनिश्चित कर सकते हैं कि यह बेहद सूक्ष्म-अनुकूलित है और आपको ऊपर दिखाए गए थोक चयन परिदृश्यों में सर्वोत्तम परिणाम मिलते हैं। यह वह जगह नहीं है जहां RavenDB को कभी भी MSSQL जैसे उत्पाद को हरा करने का मौका मिलेगा।

हालांकि, यह डेटाबेस स्वयं नहीं है जो अंतर बनाता है, ज्यादातर समय, यह एप्लिकेशन और इसकी डेटा एक्सेस रणनीतियों है जो आपको बिजली की चपलता लाएगा जो कि रावेन प्रसिद्ध है।

पूरी बात यह है कि दस्तावेज़ डेटाबेस आपको अपने डेटा (कुल जड़ों, denormalized संदर्भ, precomputed अनुक्रमणिका, आदि) को कैसे व्यवस्थित करने की अनुमति देता है। यह रावेनडीबी के लिए कुछ विशिष्ट नहीं है क्योंकि आप उन चीजों को मोंगोडीबी और कॉच डीबी के साथ भी कर सकते हैं, इसलिए शायद उन डेटाबेसों में सबसे आंतरिक अंतर यह है कि रावेन आपको बहुत अच्छा और आसान .NET अनुभव देता है और इसमें से बाहर है बहु दस्तावेज़ लेनदेन बॉक्स। कई अन्य मिठाई भी हैं, लेकिन आम तौर पर वे लोग हैं जो आपको विभिन्न डेटाबेस के बीच निर्णय लेते हैं।

+0

@amanda RavenDB एक "दस्तावेज़ डेटाबेस" है और मुझे लगता है कि यह सिर्फ इसके लिए सही काम करता है। अगर मैं अधिक से अधिक दस्तावेजों के उपयोग के लिए रावेनडीबी का उपयोग करना चाहता था, तो मेरा अनुमान होगा कि डीबी को सर्वोत्तम प्रदर्शन के लिए डिजाइन करने और डिजाइन करने के लिए, जैसा कि आपको एसक्यूएल के साथ करना है। फिर भी, मैं डीबी का उपयोग उस उद्देश्य के लिए नहीं करूँगा जिसका उद्देश्य यह नहीं था, इससे कोई फर्क नहीं पड़ता कि इसका उपयोग करना कितना रोमांचक है! –

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