一般來說,我做某件事之前建議對排序是可能破陣該順序(例如GroupBy可以在LINQ2SQL中生成SQL)。也可以嘗試只訂購你將要使用的東西。如果僅限選擇的必填字段/屬性,則可以提高查詢性能。你可以擺弄這個sample和使用真正後端來代替:
var Fisks=new[]{
new {Havn=new{Id=1},Date=DateTime.MinValue,Arter=new{Name="A"},Sort=1,Title="A1"},
new {Havn=new{Id=1},Date=DateTime.MinValue.AddDays(1),Arter=new{Name="A"},Sort=1,Title="A2"},
new {Havn=new{Id=1},Date=DateTime.MinValue,Arter=new{Name="B"},Sort=1,Title="B1",},
new {Havn=new{Id=1},Date=DateTime.MinValue.AddDays(2),Arter=new{Name="B"},Sort=1,Title="B2",},
new {Havn=new{Id=1},Date=DateTime.MinValue.AddDays(2),Arter=new{Name="B"},Sort=1,Title="B3",},
};
var stopwatch=Stopwatch.StartNew();
var one = Fisks.Where(s=>s.Havn.Id == 1).OrderByDescending(s=>s.Date);
var two = one.GroupBy(s=>new {s.Arter.Name, s.Sort});
var three = two.Select(s=>s.FirstOrDefault());
var answer=three.ToArray();
stopwatch.Stop();
stopwatch.ElapsedTicks.Dump("elapsed Ticks");
answer.Dump();
stopwatch.Restart();
answer=Fisks
.Where(f=>f.Havn.Id.Equals(1))
.GroupBy(s=>new {s.Arter.Name, s.Sort},(k,g)=>new{
s=g.OrderByDescending(s=>s.Date).First()//TOP 1 -> quite fast
})
.Select(g=>g.s)
.OrderByDescending(s=>s.Date) // only fully order results
.ToArray();
stopwatch.Stop();
stopwatch.ElapsedTicks.Dump("elapsed Ticks");
answer.Dump();
如果你對任何SQL Server的工作,你應該檢查在LINQPad生成的SQL。你不想以n+1 Query結束。索引Havn.Id
和Fisks.Date
也可能有所幫助。
來源
2015-06-14 18:26:44
mbx
嘗試向數據庫中的表添加索引以提高這些操作的性能。 – dotctor
我認爲你將不可接受的性能歸因於查詢的隨機元素(GroupBy)。使用Profiler和Showplan XML事件捕獲執行計劃。 – usr
我假設你明白這些延期的執行?你確定它是'GroupBy',速度很慢嗎? –