【问题标题】:How can I improve the performance of LinqToSql queries that use EntitySet properties?如何提高使用 EntitySet 属性的 LinqToSql 查询的性能?
【发布时间】:2010-05-21 05:37:19
【问题描述】:

我正在使用 LinqToSql 查询一个小型、简单的 SQL Server CE 数据库。

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

例如,如果我有一个由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)
)

【问题讨论】:

    标签: linq performance linq-to-sql sql-server-ce


    【解决方案1】:

    我以前没有使用过带有 Linq to SQL 的 SQL Server CE,但是对于这么小的数据库,我的直觉告诉我,性能问题更多地与糟糕的查询优化有关,而不是与磁盘访问有关。

    尝试从 Linq to SQL 对象获取 SQL 查询,看看会发生什么。或许可以针对 CE 数据库手动运行这些查询以查看它们的执行情况。

    很可能只添加正确的索引就可以解决问题。

    您也可以试试 LinqToSQL Profiler。 http://l2sprof.com/

    【讨论】:

    • 杰夫,谢谢。查看实际的 SQL 查询帮助我找出问题所在。事实证明,我在select 子句中填充的对象的一个​​属性导致性能不佳。但是,当我将其注释掉时,它对 SQL 查询没有任何影响!我不确定为什么,但我认为这是因为该属性是 System.Windows.Media.Brush,它没有等效的 SQL。无论如何,如果我将逻辑设置为单独的 foreach 循环,则处理查询的时间从 ~3500ms 下降到 ~100ms。你对此有什么解释吗?
    • 这很有趣。我想知道当 Linq to SQL 试图匹配类型并且无法找到匹配项时,这是否类似于每一行引发的内部异常。很难说。如果您真的有兴趣找出原因,可以进入 LinqToSQL 方法的调试器符号。 blogs.msdn.com/sburke/archive/2008/01/16/…
    猜你喜欢
    • 1970-01-01
    • 2013-03-21
    • 1970-01-01
    • 2017-01-21
    • 2013-12-15
    • 1970-01-01
    • 2023-03-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多