【问题标题】:LINQ to SQL performance with "SELECT TOP {x}" queries使用“SELECT TOP {x}”查询的 LINQ to SQL 性能
【发布时间】:2011-01-03 14:54:09
【问题描述】:

在查找如何使用 LINQ-to-SQL 执行与 SELECT TOP 5 等效的操作时,我看到的所有答案都建议使用 .Take(),如下所示:

var myObject = (
from myObjects in repository.GetAllMyObjects()
select myObject)
.Take(10);

我还不了解 LINQ 在幕后的大部分工作原理,但根据我对类 C 语言的理解,这可以通过首先分配一个包含所有记录的临时数组,然后复制数组中的前 10 个元素来解决变种。如果您正在处理小型数据集或没有任何性能限制,则不是这样的问题,但是如果您从可以包含数百万条记录的表中选择最近的 5 个日志条目,这对我来说似乎非常低效。

我对这是如何工作的理解有误吗?如果是这样,有人可以解释实际发生的情况吗?否则,有什么(如果有的话)更好(即更有效)的方法,只通过 LINQ-to-SQL 选择 x 记录?

[编辑]

我假设 myObject 类根据已接受答案中的建议将 LINQ-to-SQL 输出发送到调试输出。我最终从这里使用了 DebuggerWriter:http://www.u2u.info/Blogs/Kris/Lists/Posts/Post.aspx?ID=11

【问题讨论】:

  • 在您的调试器中,您可以检查 Linq 对象,它会向您显示它将执行的 SQL 查询。也许这会有所帮助?

标签: asp.net sql linq-to-sql select


【解决方案1】:

你的假设是错误的。使用 Linq to SQL,它会评估为 Expression<Func<...>>,可以对其进行评估并生成正确的 SQL。您无需担心它会加载所有记录。

另外,请参阅以下问题。您可以将流附加到您的DataContext 并查看生成的 SQL。 How to get the TSQL Query from LINQ DataContext.SubmitChanges()

【讨论】:

  • 数据上下文输出日志是一个很棒的技巧!
【解决方案2】:

LINQ 使用延迟执行,对于 LINQ-to-SQL,使用表达式树。

在您枚举Take 调用的结果之前,不会执行任何查询,因此您无需担心任何事情。

【讨论】:

    【解决方案3】:

    我上周刚刚经历过这个!我在我的开发数据库上打开了 SQL 分析器并逐步执行了代码。看到为各种查询生成的 SQL 非常有趣。我建议你也这样做。这可能不是您问题的确切答案,但看到您的各种组件如何根据调用的内容生成完全不同的 SQL 语句,这无疑是有启发性的。

    我相信 MSDN 上的“延迟查询解析”或其他内容(?)也会很有启发性。

    【讨论】:

    • 我使用的是 SQL Express 数据库,所以据我所知,在这种情况下没有适合我的 SQL Profiler :(
    猜你喜欢
    • 1970-01-01
    • 2012-05-16
    • 1970-01-01
    • 1970-01-01
    • 2016-01-08
    • 2020-02-04
    • 2018-07-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多