Michells Mesterværk

Underligt performance problem

by Daniel 14. April 2009 10:52

Udover at nyde det godt vejr i påsken har jeg brugt de sene aftener på at kode. Det har været forryggende og jeg har savnet at få noget kode fra hånden.

Jeg stødte midlertidigt på et problem som jeg mildest talt ikke har været ude for før. Selvom problemet var nemt at komme udenom efterlod kernen af problemet stadig en del tanker tilbage i mit hovede.

Måske kan en af jer svare på hvorfor det ene performere bedre end det andet.

Med var

var result = from p in _context.ForumMessages
       where p.PrevRef == 0
       orderby p.TimeStamp descending
       select new ForumMessageCount {
         ForumMessageId = p.ID,
         ForumSubject = p.Subject,
         Content = p.Message,
         Author = p.Email,
         TimeStamp = p.TimeStamp,
         AnswerCount = ( from o in _context.ForumMessages
                 where o.TopID == p.ID && o.PrevRef > 0
                 select o ).Count(),
         LastAnswer = ( from q in _context.ForumMessages
                where q.TopID == p.ID && q.PrevRef > 0
                orderby q.ID descending
                select new ForumMessageCount() {
                  ForumMessageId = q.ID,
                  ForumSubject = q.Subject,
                  TimeStamp = q.TimeStamp,
                  Content = q.Message,
                  Author = q.Email,
                } ).Take( 1 ).SingleOrDefault()
       };

Uden var

IEnumerable<ForumMessageCount> result = from p in _context.ForumMessages
                 where p.PrevRef == 0
                 orderby p.TimeStamp descending
                 select new ForumMessageCount {
                   ForumMessageId = p.ID,
                   ForumSubject = p.Subject,
                   Content = p.Message,
                   Author = p.Email,
                   TimeStamp = p.TimeStamp,
                   AnswerCount = ( from o in _context.ForumMessages
                           where o.TopID == p.ID && o.PrevRef > 0
                           select o ).Count(),
                   LastAnswer = ( from q in _context.ForumMessages
                          where q.TopID == p.ID && q.PrevRef > 0
                          orderby q.ID descending
                          select new ForumMessageCount() {
                            ForumMessageId = q.ID,
                            ForumSubject = q.Subject,
                            TimeStamp = q.TimeStamp,
                            Content = q.Message,
                            Author = q.Email,
                          } ).Take( 1 ).SingleOrDefault()
                 };

Tags:

Comments

4/14/2009 11:39:50 AM #

Mark S. Rasmussen

Uden at forholde mig til dit spørgsmål, så vil jeg blot advare om at den query der nok vil kunne gøre din SQL Server (formoder jeg) ked af det hvis du får en ordentlig datamængde.

Begge de subqueries du laver er korrelerede og vil således give dig en voldsom mængde IO - som dog forhåbentligt er logisk / cached.

Begge subqueries ser ud til at kunne klares væsentligt mere effektivt via et par CTE's og så joine dem igennem. Eller endnu bedre, via nogle persisted views - da det formentligt er WORM data. Og hvis du insisterer på LINQ2SQL, så kan du bare smide et view ovenpå din query og så lave en LINQ entity ud af den.

Mark S. Rasmussen Denmark

4/14/2009 12:02:52 PM #

Brian

Jeg har meget svært ved at tro, at årsagen skulle være i ovenstående. For det første afvikler du ikke dine queries i dine eksempler, så i begge tilfælde er der blot tale om at bygge selve forespørgslen. Det kan jeg ikke tro tager lang tid.

For det andet vil jeg antage, at var resulterer i at compileren indsætter IEnumerable<ForumMessageCount>, hvilket vil sige, at begge eksempler oversættes til identisk IL. Check typen af result i første eksempel.

Brian Denmark

4/15/2009 7:19:03 PM #

admin

Jeg har dummet mig.

Det er jo selvfølgelig fordi, at i "IEnumerable<ForumMessageCount>" eksemplet, der bliver alle records fra min LINQ query returnet, hvorimod i "var" eksemplet bliver der returneret en IQueryable<T>. Det hele giver mere mening når man ser på hvordan jeg eksekvere min LINQ til sidst (hvilket jeg ikke postede først):

List<ForumMessageCount> messages = result.Take( 10 ).ToList();

admin

4/27/2009 8:16:37 PM #

kampanye damai pemilu indonesia 2009

very nice info, thanks.

kampanye damai pemilu indonesia 2009 United States

10/21/2009 8:17:44 AM #

Online payday loans

By keeping attachment of this site, you can get more and more genuine information.

Online payday loans United Kingdom

10/30/2009 8:12:57 AM #

Same day payday loans

Hey, you have made some important points on there.

Same day payday loans United States

11/2/2009 8:00:00 AM #

Payday No Teletrack

Nice info and one of the best posts you made here........... Thanks for this.

Payday No Teletrack United States

11/11/2009 8:36:50 AM #

Quick Cheap Payday Loans

Amazing, your presentation is very nice, I think many readers will read this with interest…..thanks.  

Quick Cheap Payday Loans United Kingdom

11/12/2009 10:25:13 AM #

mobile Contract deals

Wow, amazing, you given here some good points…………..I liked it………thanks for sharing your thoughts………..

mobile Contract deals United Kingdom

11/13/2009 8:58:16 AM #

Golden Triangle India

What a nice site it is! I really liked this. Thanks for making these helpful points.

Golden Triangle India United States

12/30/2009 2:02:25 PM #

astaga.com lifestyle on the net

Thank you really for this informative article. Such article are worth reading I myself liked it very much. Plz post some more such kind of articles if u have more.
best regards from astaga!com lifestyle on the net

astaga.com lifestyle on the net United States

2/14/2010 1:28:05 PM #

اخبار

Thank you very much for the possibility to have a look into the office. Nice boy, he has got the talent to explain.

اخبار Egypt

2/23/2010 8:26:44 AM #

Discount magazine subscriptions

We just couldnt leave your website before saying that we really enjoyed the quality information you offer to your visitors... Will be back often to check up on new stuff you post!

Discount magazine subscriptions United Kingdom

3/9/2010 8:43:44 PM #

WoW Mobile

Do you know which cell phone services allow tethering?

WoW Mobile United States

3/14/2010 11:10:29 PM #

ssk sorgulama

This is a really good read for me, Must admit that you are one of the best bloggers I ever saw.Thanks for posting this informative article.

ssk sorgulama United States

3/17/2010 11:12:59 AM #

arac sorgulama

I admire the valuable information you offer in your articles. I will bookmark your blog and have my children check up here often. I am quite sure they will learn lots of new stuff here than anybody else!

arac sorgulama United States

3/20/2010 3:06:05 PM #

ehliyet

Excellent post.I want to thank you for this informative read, I really appreciate sharing this great post. Keep up your work.

ehliyet Denmark

3/25/2010 6:29:10 AM #

indonesia java international destination

Thanks for posting this info. I just want to let you know that I just check out your site and I find it very interesting and informative.

indonesia java international destination United States

3/25/2010 6:30:52 AM #

webthesurfi rugs webdesign

I admire the valuable information you offer in your articles. I will bookmark your blog and have my children check up here often. I am quite sure they will learn lots of new stuff here than anybody else!

webthesurfi rugs webdesign United States

Add comment


(Will show your Gravatar icon)

(De 3 specielle karaktere i det danske alfabet?)
  Country flag

biuquote
  • Comment
  • Preview
Loading



Powered by BlogEngine.NET 1.6.0.0
Theme by Mads Kristensen