gpt4 book ai didi

c# - Linq2Sql 的性能问题

转载 作者:行者123 更新时间:2023-11-30 18:41:16 24 4
gpt4 key购买 nike

我正在尝试改进大量使用 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 在用户 session 的生命周期内重复使用相同的 DataContext。我一直觉得你应该在每次手术后处理掉它。这可能是问题所在吗?

让我补充一点,当我分析 SQL(从应用程序执行时)时,我没有什么可担心的。读取 <15,CPU <5,写入什么都没有,持续时间最多为 20。所以我很确定这不是语句的执行,而是 LINQ2Sql 正在做的一些处理。

最佳答案

我想我知道发生了什么。

数据关系并不像 LINQ 描述的那么简单。Table1 引用了 Table2表 2 确实引用了表 3但是 Table4 并未直接绑定(bind)到 T3,还有 2 个在路上。

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

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

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

哇...只是哇!

关于c# - Linq2Sql 的性能问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6989916/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com