【问题标题】:When does compile queries of LINQ to SQL improve performance何时编译 LINQ to SQL 的查询可以提高性能
【发布时间】:2017-03-02 20:50:39
【问题描述】:

我指的是an article,它专注于加速 LINQ to SQL 查询。它提到的技术之一是“使用编译查询”并解释了如何使用它。

我想看到编译查询的性能改进,因此我尝试了作者提供的相同示例。我使用 Northwind Db 作为数据上下文。我尝试了正常执行和编译查询执行,并在 LINQ PAD 上检查了它们。

首先我尝试不使用使用 CompileQuery 执行查询。耗时 2.065 秒。

var oo =   from o in Orders
   where o.OrderDetails.Any (p => p.UnitPrice > 100)
   select o;

oo.Dump ("Order items with unit price more than $100");

var oo1 = from o in Orders
   where o.OrderDetails.Any (p => p.UnitPrice > 10)
   select o;

oo1.Dump ("Order items with unit price more than $10"); 

其次,查询with 使用CompileQuery。耗时 2.100 秒。

var oo = CompiledQuery.Compile ((TypedDataContext dc, decimal unitPrice) =>    
   from o in Orders
   where o.OrderDetails.Any (p => p.UnitPrice > unitPrice)
   select o
);

oo (this, 100).Dump ("Order items with unit price more than $100");
oo (this, 10).Dump ("Order items with unit price more than $10");

多次重新执行它们表明两种方法所花费的时间几乎相似。

这里我们只看到每个方法的两个查询执行。我尝试为每个查询进行 10 个查询。但他们都完成了大约 7 秒。

预编译查询真的能提高性能吗?还是我弄错了它的使用条款?

感谢您的时间和考虑。

编辑: 阅读接受的答案后,读者可能还想查看this article,它很好地解释了编译查询如何提高性能。

【问题讨论】:

    标签: c# performance linq-to-sql


    【解决方案1】:

    请记住,LINQ 查询的两个主要部分可能特别昂贵:

    1. 将 LINQ 表达式编译为 SQL 语句。
    2. 运行 SQL 语句并检索结果

    在您的情况下,您有一个相对简单的查询,或者是一个非常慢的数据库连接,一些非常大的数据集,或者没有以最佳方式索引的表来运行这个特定的查询。或者也许是这三者的结合。

    因此,与为您的查询生成 SQL 所花费的时间(可能 10-50 毫秒)相比,第二步所花费的时间非常多(约 1000 毫秒),以至于您几乎无法注意到差异。

    如果满足以下条件,您会看到显着的改进:

    1. 您的 LINQ 查询很复杂,
    2. 您的数据库连接速度很快,
    3. SQL 查询本身可以在该数据库上快速运行,并且
    4. 结果集足够小,可以相对较快地从数据库传回。

    实际上,我的查询可能需要 500 毫秒以上的时间来编译,但实际运行只需要几毫秒。这些通常是我专注于预编译查询的情况。

    提前了解预编译查询可以获得什么样的性能提升的一个好方法是使用 Stopwatch 对象对查询的 second 实例进行计时,然后运行生成的SQL 直接使用 LINQPad 的分析 SQL 功能。如果 SQL 查询快速返回,但 LINQ 查询需要很长时间,则适合进行预编译。

    【讨论】:

    • 所以这意味着在大查询的情况下我们可以消除foreach执行的编译时间,然后只考虑改进第二步(执行和检索结果)
    • @Marshal:是的,就是这样。
    • 非常感谢詹姆斯。这确实很有帮助。顺便说一句,我也喜欢阅读你的博客;)
    • 如果“大型查询”是指具有大量复杂性(连接等)的查询,而不是具有大量结果的查询。
    • 同样值得注意的是starting with .NET 4.5, LINQ queries are cached automatically,因此编译查询会有明显改进的情况更少。
    猜你喜欢
    • 1970-01-01
    • 2019-02-04
    • 2012-05-16
    • 2010-11-23
    • 1970-01-01
    • 1970-01-01
    • 2012-07-09
    • 1970-01-01
    • 2011-02-08
    相关资源
    最近更新 更多