我指的是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来解释编译查询如何提高性能。
答案 0 :(得分:10)
请记住,LINQ查询有两个主要部分可能特别昂贵:
在您的情况下,您有一个相对简单的查询,一个非常慢的数据库连接,一些非常大的数据集,或者没有以最佳方式索引以运行此特定查询的表。或者也许是三者的组合。
因此,与为查询生成SQL所花费的时间(可能是10-50毫秒)相比,第二步需要花费很多时间(~1000毫秒)才能发现差异。< / p>
如果满足以下条件,您会看到重大改进:
实际上,我的查询编译时间可能超过500毫秒,但实际运行的时间只有几毫秒。这些通常是我专注于预编译查询的情况。
提前了解预编译查询可以获得哪种性能提升的一种好方法是使用Stopwatch
对象计算查询的第二个实例,然后运行生成的SQL直接使用LINQPad的Analyze SQL功能。如果SQL查询返回很快但LINQ查询需要很长时间,那么这是预编译的好选择。