2011-06-06 13 views
14

से 3x धीमी है मेरे पास एक साधारण परीक्षण है जो 5000 बार क्वेरी चलाता है। क्वेरी की LINQ संस्करण पर 3 बार HQL लेता है और कैश की गई Linq संस्करण HQL काNHibernate Linq क्वेरी HQL

HQL कैश्ड संस्करण की तुलना में काफी धीमी है:

session.CreateQuery(String.Format("from Episode where SeriesId='{0}' and SeasonNumber='{1}' and EpisodeNumber='{2}'", seriesId, seasonNumber, episodeNumber)) 
       .SetMaxResults(1) 
       .SetCacheable(true) 
       .UniqueResult<Episode>(); 

Linq:

session.Query<Episode>() 
     .Where(c => c.SeriesId == seriesId && c.SeasonNumber == seasonNumber && c.EpisodeNumber == episodeNumber) 
     .Cacheable() 
     .FirstOrDefault(); 

परिणाम

 
HQL: Cached: less than a second No-Cache: 5 seconds 
LINQ: Cached: 8 seconds   No-Cache: 15 seconds 

मैं बस यह सुनिश्चित करना चाहता हूं कि मुझे अपेक्षित ओवरहेड का अनुभव हो रहा है और ऐसा कुछ नहीं जो मैं गलत कर रहा हूं।

यदि उस सिर पर है और वहां बहुत कुछ नहीं है, तो क्या आप शायद एक मध्यम जमीन का सुझाव दे सकते हैं, जिसके लिए कम स्ट्रिंग की आवश्यकता होगी लेकिन बेहतर प्रदर्शन प्रदान किया जाएगा?

नोट: धाराप्रवाह NHibernate .Cache(c => c.UseQueryCache().UseSecondLevelCache().UseMinimalPuts().ProviderClass<HashtableCacheProvider>())

+0

क्या सभी 5000 पुनरावृत्तियों के लिए linq test 'बिल्कुल' से उत्पन्न एसक्यूएल कथन है? – Rippo

+0

मुझे यह SQL कथन नहीं लगता है, क्योंकि कैश किए गए संस्करण जो डेटाबेस को भी हिट नहीं करते हैं, 1 से कम की तुलना में 8 सेकंड है। दोनों मामलों में डेटाबेस केवल एक बार मारा जाता है। –

+0

क्षमा करें कि मेरा मुद्दा होना चाहिए था, क्या आप वाकई डेटाबेस को linq संस्करण के लिए हिट करते हैं? – Rippo

उत्तर

10

में मेरे कैश सेटिंग मुझे लगता है कि समस्या इस प्रकार है। यह प्रश्न:

session.Query<Episode>() 
     .Where(c => c.SeriesId == seriesId && c.SeasonNumber == seasonNumber && c.EpisodeNumber == episodeNumber) 
     .Cacheable() 
     .FirstOrDefault(); 

डेटाबेस से सभी एपिसोड लोड करता है, उन्हें कैश में डालता है, और फिर संग्रह का पहला उदाहरण देता है। जब FirstOrDefault कहा जाता है, Where(c => c.SeriesId == seriesId && c.SeasonNumber == seasonNumber && c.EpisodeNumber == episodeNumber) के लिए क्वेरी निष्पादित की जाती है और फिर FirstOrDefault पूरे अनुक्रम पर लागू होता है।

कुछ की तरह:

  1. .Where(c => c.SeriesId == seriesId && c.SeasonN... एसक्यूएल निष्पादित किया जाता है
  2. .FirstOrDefault() की 1.

तो संग्रह के सभी तत्वों से अधिक मूल्यांकन किया जाता है अगर आप

session.Query<Episode>() 
     .Where(c => c.SeriesId == seriesId && c.SeasonNumber == seasonNumber && c.EpisodeNumber == episodeNumber) 
     .Cacheable() 
     .SetMaxResults(1) 
     .UniqueResult(); 

की तरह कुछ कोशिश यह आपके एचक्यूएल quer की तरह व्यवहार करना चाहिए y।