【问题标题】:Perf issue with Linq2SqlLinq2Sql 的性能问题
【发布时间】:2011-08-08 23:48:27
【问题描述】:

我正在尝试提高大量使用 Linq2Sql 的应用程序的性能。我发现了一种非常慢的特定方法。这是一个讨厌的嵌套.Sum() 语句。执行时只需 30 多秒即可返回数据。数据的总行数可能是 3000。如果我使用 LinqPad 生成的 sql 并运行它,我会在不到一秒的时间内取回数据。

我不知道框架会在这里返回什么。 应该被 where 子句过滤掉,对吧?我也想象它会从内到外发挥作用。从哪里开始,然后对所有分数求和,然后在 T2 中对每个分数求和,然后在 T1 中对每个分数求和。

ParentTable.Table1.Sum
(
 t1=>
  t1.Table2.Sum
  (
   t2=>
     t2.Table3.Where(t3=>t3.Table4.Id==275).Sum(t3=>t3.Score)
  )
)

更复杂的是,LinqPad 可以在半秒内执行相同的语句。

我想我的问题是,为什么 Linq2Sql 和 TSql 的速度会有这样的差异? Linq 是否带回所有行并在应用框上进行过滤?

现在,webapp 在用户会话的整个生命周期内重复使用相同的 DataContext。我一直认为您应该在每次手术后处理掉它。会不会是这个问题?

让我补充一点,当我分析 SQL(从应用程序执行时)时,我没有什么可担心的。读取

【问题讨论】:

  • 你怎么知道是这个Sum需要30秒才能执行?
  • 在整个方法周围添加了一个秒表,在总和周围添加了另一个。 Sum 至少需要 30s 而整个方法是 30.Ns
  • 来自我的调试输出:Save=>SumScores 花了 31083 |保存花了 31136
  • 如果在数据上下文中关闭延迟加载会发生什么?
  • @Burke Holland 我并没有真正使用 Linq2Sql 你在谈论延迟加载属性吗?这已经设置为 false

标签: c# sql performance linq-to-sql


【解决方案1】:

我想我知道发生了什么。

数据关系并不像 LINQ 所说的那么简单。 表 1 有表 2 的引用 表 2 确实引用了表 3 但是 Table4 没有直接绑定到 T3,还有另外 2 个。

这应该不会影响任何事情,但在 Table1 对象的部分类中填充的是自定义全局“缓存”字典。每当您从 Table1 请求任何内容时,它都会确保该表中的每条记录都加载到内存中。所有对象都存在相同的模式。

所以基本上,通过快速简单的求和,它会将所有 6 个表(t1、t2、t3、t3b、t3c、t4)中的每条记录加载到内存中,然后进行求和。

在后续请求中,它会查看缓存中的每个项目以查看它是否已过时。这也解释了数据不一致的另一个问题。

哇……哇!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-03
    • 2010-09-29
    • 2011-09-05
    • 2010-12-29
    • 1970-01-01
    • 2023-04-06
    • 2017-04-13
    相关资源
    最近更新 更多