【发布时间】: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