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

2024-01-26

我指的是一篇文章 http://www.albahari.com/nutshell/speedinguplinqtosql.aspx其重点是加速 LINQ to SQL 查询。它提到的技术之一是“使用编译查询”并解释了如何使用它。

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

首先我尝试执行查询without使用编译查询。花了 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使用编译查询。花了 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秒。

预编译查询真的能提高性能吗?或者我在使用条款上弄错了?

感谢您的时间和考虑。

Edit:阅读已接受的答案后,读者可能还想查看本文 http://www.codeproject.com/Articles/38174/How-to-improve-your-LINQ-query-performance-by-5-X这很好地解释了编译查询如何提高性能。


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

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

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

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

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

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

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐