何时编译LINQ to SQL的查询可以提高性能

时间:2012-04-05 04:24:10

标签: c# performance linq-to-sql

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

我希望看到编译查询的性能提升,因此我尝试了作者提供的相同示例。我使用Northwind Db作为datacontext。我尝试了正常执行和编译查询执行,并在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"); 

其次,使用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来解释编译查询如何提高性能。

1 个答案:

答案 0 :(得分:10)

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

  1. 将LINQ表达式编译为SQL语句。
  2. 运行SQL语句并检索结果
  3. 在您的情况下,您有一个相对简单的查询,一个非常慢的数据库连接,一些非常大的数据集,或者没有以最佳方式索引以运行此特定查询的表。或者也许是三者的组合。

    因此,与为查询生成SQL所花费的时间(可能是10-50毫秒)相比,第二步需要花费很多时间(~1000毫秒)才能发现差异。< / p>

    如果满足以下条件,您会看到重大改进:

    1. 您的LINQ查询很复杂,
    2. 您与数据库的连接速度很快,
    3. SQL查询本身在该数据库上快速运行,
    4. 结果集足够小,可以相对快速地从数据库传回来。
    5. 实际上,我的查询编译时间可能超过500毫秒,但实际运行的时间只有几毫秒。这些通常是我专注于预编译查询的情况。

      提前了解预编译查询可以获得哪种性能提升的一种好方法是使用Stopwatch对象计算查询的第二个实例,然后运行生成的SQL直接使用LINQPad的Analyze SQL功能。如果SQL查询返回很快但LINQ查询需要很长时间,那么这是预编译的好选择。