2010-05-21 93 views
2

我正在使用LinqToSql來查詢一個小的,簡單的SQL Server CE數據庫。如何提高使用EntitySet屬性的LinqToSql查詢的性能?

我注意到任何涉及子屬性的操作都令人失望地慢。

例如,如果我有一個Order表引用的Customer表,LinqToSql將自動創建一個EntitySet<Order>屬性。這是一個很好的方便,允許我執行Customer.Order.Where(o => o.ProductName = "Stopwatch")之類的操作,但由於某些原因,SQL Server CE在嘗試執行此類操作時掛起來非常糟糕。我的一個疑問,其實並不複雜,需要3-4秒才能完成。

我可以得到速度達到可以接受的,甚至快,如果我只是抓住了兩個表單獨並將其轉換爲List<Customer>List<Order>,然後用我自己的查詢手動加入的話,但這需要很多額外的代碼。 LinqToSql自動生成這些EntitySet<T>屬性 - 我想要使用它們。

那麼,我該如何提高性能呢?例如,有沒有任何DataContext選項可以幫助?

注意:我的數據庫初始狀態只有大約250K,我不認爲它會增長到超過1-2Mb。所以,這不像有很多記錄。


更新

下面是我在我的問題中使用的示例表定義:

create table Order 
(
    Id int identity(1, 1) primary key, 
    ProductName ntext null, 
    Quantity int null 
) 

create table Customer 
(
    Id int identity(1, 1) primary key, 
    OrderId int null references Order (Id) 
) 

回答

2

我沒有用的SQL Server CE與之前的LINQ到SQL,但有了這樣一個小型的數據庫,我的直覺告訴我性能問題更多的是與磁盤訪問相關的糟糕的查詢優化。

嘗試從您的Linq到SQL對象獲取SQL查詢以查看可能發生的情況。也許可以針對CE數據庫手動運行這些查詢以查看它們的執行方式。

只需添加正確的索引就可以解決問題。

您也可以嘗試LinqToSQL事件探查器。 http://l2sprof.com/

+1

傑夫,謝謝。看着實際的SQL查詢幫助我找出問題所在。原來,我在'select'子句中填充的對象中的一個屬性導致了糟糕的性能。當我評論它時,它對SQL查詢沒有任何影響!我不確定究竟是爲什麼,但我認爲這是因爲該屬性是一個'System.Windows.Media.Brush',它沒有SQL等價物。無論如何,如果我將邏輯設置爲單獨的foreach循環,處理查詢的時間從〜3500ms降至〜100ms。你有這個解釋嗎? – devuxer 2010-05-21 20:25:28

+0

這很有趣。我想知道,當Linq to SQL嘗試匹配類型並找不到匹配項時,是否像每行都引發內部異常。很難說。如果你真的有興趣找出原因,你可以進入LinqToSQL方法的調試器符號。 http://blogs.msdn.com/sburke/archive/2008/01/16/configuring-visual-studio-to-debug-net-framework-source-code.aspx – 2010-05-21 21:26:54