我正在查看LINJPad提供的示例LINQ查询,这些查询来自于Cuts 4.0中的一本Nutshell书籍,并且遇到了我从未在LINQ to SQL中使用过的东西...编译查询。
这是确切的例子:
// LINQ to SQL lets you precompile queries so that you pay the cost of translating
// the query from LINQ into SQL only once. In LINQPad the typed DataContext is
// called TypeDataContext, so we proceed as follows:
var cc = CompiledQuery.Compile ((TypedDataContext dc, decimal minPrice) =>
from c in Customers
where c.Purchases.Any (p => p.Price > minPrice)
select c
);
cc (this, 100).Dump ("Customers who spend more than $100");
cc (this, 1000).Dump ("Customers who spend more than $1000");
预编译这样的LINQ to SQL查询实际上是什么给我买的?我是否会从稍微复杂一点的查询中获得性能提升?这甚至用于实际操作?
答案 0 :(得分:8)
简而言之,当您需要多次运行 时,预编译的查询会为您带来性能提升。
这是关于LINQ To SQL性能的一些information。
我在几个地方看过 编译你的LINQ会有所帮助,但我 从来没有听过有人怎么说 激烈的速度提升可以。 例如,在我最喜欢的一个 Fabrice的书籍(LINQ in Action) 玛格丽和其他人,他引用了 第296页由Rico Mariani撰写的博客文章 标题为DLINQ(Linq to SQL Performance (第1部分)说使用编译 查询提供近两倍 执行未编译的查询, 并继续说它带来了 表现在使用a的93%以内 原始数据阅读器。嗯,足够了 说我自己从未参加过测试。一世 本来可以住两次,但不是 37次。
所以,从这看起来,你似乎 应始终编译LINQ to SQL 查询。嗯,那不是真的。 我建议的是,如果你 有理由执行相同的 你应该一遍又一遍地查询 强烈考虑编译。如果是的话 例如,你只是在做一个LINQ SQL调用一次,没有任何好处 因为无论如何你必须编译它。 叫它十次?好吧,你会的 必须自己决定。
答案 1 :(得分:1)
我使用编译查询的方式是静态的:我静态地声明编译的查询,因此查询树结构只需要解析一次,并且你基本上有一个准备好的语句只需要一些额外的参数。 这主要用于网站,因此查询必须只编译一次。性能提升当然取决于查询的复杂性。
答案 2 :(得分:1)
我们在公司使用此功能,并且对于每次运行通常无需编译的查询。在这会产生影响之前,您不必过度使用linq to sql,但这将取决于服务器上的流量和负载。
答案 3 :(得分:1)
来自article from Rico Mariani的表演花絮
Q4:
预编译的缺点是什么? 疑问?
A:
预编译没有任何惩罚 (见测验#13)。唯一的方法 失败的表现就是你预先编译 数以万计的查询,然后几乎不使用 他们在一起 - 你会浪费很多 没有充分理由的记忆。
但是衡量:)