在开发应用程序时,我通常使用存储过程来包含CRUD逻辑,以提高性能和可维护性。但是,在对LINQ进行了实验之后,我想知道,使用编译的LINQ查询对存储过程是否有助于提高性能?
发布于 2011-02-23 19:33:06
根据您对DevSlick和a1ex07的评论,您似乎对LINQ是什么有一个根本的误解。为了让LINQ查询允许链接,如
var activePeople = peopleList.Where(o => o.Active).OrderBy(o => o.Ordering).Select(o => o.Name);LINQ查询的执行必须是延后,直到枚举为止:
foreach(var person in activePeople)
{
//If this is LINQ-to-SQL, the query to peopleList has waited until now to request anything from the database
}这意味着,在此之前,您的计算机也不会实际解释查询.Where(o => o.Active).OrderBy(o => o.Ordering).Select(o => o.Name)。如果您运行相同的查询100次,这意味着计算机必须重新解释该查询100次。对于LINQ,这意味着在每次将SQL发送到数据库之前,将查询转换到SQL 100次,即使每次SQL完全相同。
提前编译查询会导致它只生成一次SQL,并且每次调用查询时都使用该SQL。这与存储过程无关--您将以编译任何其他查询的方式编译一个从查询到存储的过程。问“哪种表现更好”是毫无意义的,因为它们并不是相互排斥的。
尽管编译查询听起来是件好事,但实际上解释LINQ查询(通常称为“计算表达式树”)比实际针对数据库执行SQL所花费的时间非常少,所以编译查询的好处很小。同时,编译查询的语法是凶残。
static readonly Func<AdventureWorksEntities, Decimal, IQueryable<SalesOrderHeader>> s_compiledQuery2 =
CompiledQuery.Compile<AdventureWorksEntities, Decimal, IQueryable<SalesOrderHeader>>(
(ctx, total) => from order in ctx.SalesOrderHeaders
where order.TotalDue >= total
select order);
var orders = s_compiledQuery2.Invoke(context, totalDue);因此,通常建议不要编译LINQ查询,因为代码噪声与效益的比率非常糟糕。
发布于 2011-02-23 18:20:49
LINQ to SQL不会提高您的性能,因为您将把每个CRUD操作作为一个字符串发送到线路上。
使用存储过程,性能仍然会更好,但是ORM(如Linq到SQL )通常会使开发时间更快。
发布于 2011-02-23 18:43:17
根据我的经验,我可以将绩效排序如下:
https://stackoverflow.com/questions/5095142
复制相似问题