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

Mar*_*hal 12 c# performance linq-to-sql

我指的是一篇专注于加速LINQ to SQL Queries的文章.它提到的技术之一是"使用编译查询"并解释了如何使用它.

我想看看编译查询的性能改进,因此我尝试了作者提供的相同示例.我使用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"); 
Run Code Online (Sandbox Code Playgroud)

其次,查询使用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");
Run Code Online (Sandbox Code Playgroud)

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

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

预编译查询是否真的能提高性能?或者我是否误解了它的使用条款?

感谢您的时间和考虑.

编辑: 阅读接受的答案后,读者可能还想阅读这篇文章,它很好地解释了编译查询如何提高性能.

Str*_*ior 10

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

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

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

因此,与为查询生成SQL所花费的时间(可能是10-50毫秒)相比,第二步是耗费大量时间(~1000毫秒),您几乎无法注意到差异.

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

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

实际上,我的查询编译时间可能超过500毫秒,但实际运行时间只有几毫秒.这些通常是我专注于预编译查询的情况.

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