我指的是
an article,其重点是加快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秒钟.
感谢您的时间和考虑.
编辑:
阅读可接受的答案后,读者也可能想要通过this article,这很好地解释了编译查询如何提高性能.
解决方法
请记住,LINQ查询有两个主要部分可能特别昂贵:
>将LINQ表达式编译成sql语句.
>运行sql语句并检索结果
在您的情况下,您有一个相对简单的查询,非常慢的数据库连接,一些非常大的数据集,或者没有以最佳方式索引的表来运行此特定查询.或者也可以是三者的组合.
因此,与为查询生成sql所花费的时间相比(可能是10-50毫秒),第二步是花费很多时间(〜1000毫秒),您几乎不会注意到差异.
如果满足以下条件,您将看到显着的改进:
>你的LINQ查询很复杂,
>你有一个快速连接到你的数据库,
> SQL查询本身在该数据库上快速运行
>结果集足够小,从数据库相对较快地传回.
实际上,我有一个查询可能需要500多个编译,但只有几毫秒才能实际运行.这些通常是我专注于预编译查询的情况.
提前知道预编译查询可以获得什么样的性能提升的一个好方法是使用Stopwatch对象对查询的第二个实例进行计时,然后使用LINQPad的Analyze sql功能直接运行生成的sql.如果SQL查询快速返回,但LINQ查询需要很长时间,那么这是预编译的好选择.