2016-07-28 21 views
2

LINQ查詢性能提高考慮到樣品臺與不同

Col 1, Col2, Col3 
1 , x , G 
1 , y , H 
2 , z , J 
2 , a , K 
2 , a , K 
3 , b , E 

我想下面的結果,即不同的行

1 , x , G 
1 , y , H 
2 , z , J 
2 , a , K 
3 , b , E 

我試圖

var Result = Context.Table.Select(C => 
       new { 
         Col1 = C.Col1, 
         Col2 = C.Col2, 
         Col3 = C.Col3 
         }).Distinct(); 

Context.Table.GroupBy(x=>new {x.Col1,x.Col2,x.Col3}).Select(x=>x.First()).ToList(); 

結果如預期的那樣,但是我的表格有35列和100萬條記錄,其大小將持續增長,查詢的當前時間爲22-30秒,因此如何提高性能並將其降低到2-3秒?

+0

也許有它實現IEquatable自定義結構類型的HashSet的。比較IEquatable實現中變化最大的屬性。 –

回答

1

使用distinct是要走的路...我想說,你嘗試的第一種方法是正確的 - 但你真的需要所有100萬行嗎?看看你可以添加什麼where條件,或者可能只是第一個x記錄?

var Result = Context.Table.Select(c => new 
    { 
     Col1 = c.Col1, 
     Col2 = c.Col2, 
     Col3 = c.Col3 
    }) 
    .Where(c => /*some condition to narrow results*/) 
    .Take(1000) //some number of the wanted amount of records 
    .Distinct(); 

你可以做的是,使用rownum來選擇批量。喜歡的東西:

public <return type> RetrieveBulk(int fromRow, int toRow) 
{ 
    return Context.Table.Where(record => record.Rownum >= fromRow && record.Rownum < toRow) 
     .Select(c => new 
     { 
      Col1 = c.Col1, 
      Col2 = c.Col2, 
      Col3 = c.Col3 
     }).Distinct(); 
} 

此代碼,那麼你可以這樣做:

List<Task<return type>> selectTasks = new List<Task<return type>>(); 
for(int i = 0; i < 1000000; i+=1000) 
{ 
    selectTasks.Add(Task.Run(() => RetrieveBulk(i, i + 1000))); 
} 

Task.WaitAll(selectTasks); 

//And then intercet data using some efficient structure as a HashSet so when you intersect it wont be o(n)2 but o(n) 
+0

我沒有where子句,所以我必須一次處理所有記錄,或者有什麼辦法可以爲表中的每列獲取不同的值?沒有多個查詢? –

+0

'獨特'操作是一個昂貴的操作,因爲它必須通過所有的數據和檢查... –

+0

@GirishSakhare - 看看我編輯 –