12

我指的是一篇专注于加快 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"); 

其次,使用 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 秒。

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

感谢您的时间和考虑。

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

4

1 回答 1

11

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

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

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

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

如果以下条件都成立,您会看到显着的改进:

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

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

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

于 2012-04-05T04:32:08.983 回答