2012-10-01 94 views
3

我需要編寫一個查詢,從用戶爲任何給定數據集定義的列中提取不同的值。可能有數百萬行,因此這些語句必須儘可能高效。以下是我的代碼。LINQ c#效率

此LINQ查詢的順序是什麼?有沒有更有效的方法來做到這一點?

var MyValues = from r in MyDataTable.AsEnumerable() 
       orderby r.Field<double>(_varName) 
       select r.Field<double>(_varName); 

IEnumerable result= MyValues.Distinct(); 
+1

,以確定最好的方法是在SQL事件探查器運行時運行LINQ查詢。您可以看到實際的SQL查詢,並基於此生成SSMS中的執行計劃。 – Codeman

+0

「LINQ查詢的順序」是什麼意思?您是否想知道執行語句的順序? –

+1

@ Pheonixblade9:實際上,通過調用'AsEnumerable()',SQL腳本是非常基本的。 'orderby'和'select'都在本地運行。 – Guvante

回答

6

我不能說太多的AsEnumerable()電話或現場轉換,但對於事情的LINQ方面,orderby是一個穩定的快速排序,應該是O(n log n)。如果我不得不猜測,除了orderby之外的所有東西都應該是O(n),所以整體上你還是隻有O(n log n)

更新:LINQ Distinct()調用也應該是O(n)

總而言之,這個東西的Big-Oh仍然是O(Kn log n),其中K是一些常數。

1

有沒有更高效的方法來做到這一點?

你可以得到更好的效率,如果你做的那種作爲初始化MyDataTable查詢的一部分,而不是事後在內存中的排序。

1

從評論

如果你想不同_varName值實際上我用MyDistinct.Distinct()

,你不能做到這一切在DBMS選擇查詢(會是什麼最有效的方法),你應該在OrderBy之前使用Distinct。這裏的順序很重要。

在開始過濾出重複項之前,您需要先訂購所有行。如果您首先使用不同,您只需要訂購其餘的。

var values = from r in MyDataTable.AsEnumerable() 
      select r.Field<double>(_varName); 
IEnumerable<double> orderedDistinctValues = values.Distinct() 
                .OrderBy(d => d); 

我曾問一個相關的問題最近這E.Lippert回敬一個很好的解釋時,順序是有意義的,當沒有:

Order of LINQ extension methods does not affect performance?

Here's a little demo在這裏你可以看到,訂單事宜,但你也可以看到它並不重要,因爲比較雙打對於cpu來說是微不足道的:

Time for first orderby then distinct: 00:00:00.0045379 
Time for first distinct then orderby: 00:00:00.0013316 
+0

如果可能的話,你能提供一個基於我的LINQ查詢的代碼示例嗎? – sammarcow

+0

@sammarcow:編輯我的答案提供一個例子和一個測量。 –

0

你的a bove查詢(linq)很好,如果你所有百萬條記錄和你有足夠的64位內存尋址操作系統內存。

查詢的順序,如果你看到下面的命令,將transalated到

Select <_varname> from MyDataTable order by <_varname> 

,並因爲它是當數據庫IDE或命令行運行,這是一樣好。

給你一個簡短的回答關於性能

  1. 把where子句中,如果你能(與列,其索引)
  2. 確保用戶可以選擇被索引的colums(_varname)。想象一下,數據庫嘗試在一個沒有建立索引的列上排序數百萬條記錄,這顯然很慢,但卻危及linq接收到這個壞記錄。
  3. 確保(如果可能的話)MyDataTable的初始化能夠正確地記錄有價值的記錄基於where子句)
  4. 分析您的基礎查詢,
  5. 如果可能,創建storedprocs(可辯論)。你可以創建一個實體模型,其中包括storedprocs藏漢

今天可能會快一些,但與該表空間越來越大,如果你的數據不排序(索引),這就是事情變得slowerr(即使你有一個好LINQ表達式)

希望這有助於

這麼說,如果你的數據庫沒有正確索引的,意思