2010-05-21 47 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