应该编译什么类型的Linq to SQL查询?

时间:2011-08-02 17:51:37

标签: c# entity-framework linq-to-sql

我正在项目中使用Linq to SQL,并阅读有关框架效率低下的文章。我已经读过,提高性能的一种方法是创建编译查询。所有查询都会更好地编译吗?或者在某些情况下它可能没有多大区别?我认为这对于获得大量流量的大规模应用程序至关重要。

感谢。

3 个答案:

答案 0 :(得分:4)

我之前遇到过这种情况。编译查询可能是一件好事,并且确实可以显着提高性能。但这并不总是最好的解决方案。

我正在制作一些需要30-40分钟才能运行的报告。我发现我们正在调用某些查询数百次。编译查询确实提供了改进,但还不够。

我最终做的是运行较少的返回更多数据的查询。这减少了打开和关闭连接。结果是在不到一分钟的时间内发布的报告。

因此,如果您需要多次运行查询,那么编译它是一个很好的选择。如果它运行数百次或数千次,您可能只需要一种新的方法。

关于这两件事的几篇文章:

报告的SQL查询优化:不同的方法

http://www.foliotek.com/devblog/sql-query-optimization-for-reporting-a-different-approach/

Linq中预编译查询的意外好处:

http://www.foliotek.com/devblog/unexpected-benefits-of-precompilation-of-linq/

还需要考虑的另一件事是数据库中的索引。你的查询很慢,但你不知道为什么它很慢。如果它正在搜索未编入索引的列,那么这也可能是您的问题。

答案 1 :(得分:4)

小心过早优化!

在您分析应用程序并确定您花费大量时间创建查询之前,开发人员的时间和简单性,可维护性和灵活性的降低都是不值得的。

即使您在查询构建上花费了大量时间,也要注意预编译查询会将运行时间减少一个相对较小的常量,而不是数量级。因此,首先考虑程序更改(如纳尼亚提及)或缓存技术,以减少实际上必须首先运行这些查询的次数。

完成此操作后,仍然发现撰写查询时存在瓶颈,很可能90%的时间花在了大约5%(或更少)的查询中。优化那些查询。

更新

Entity Framework的现代实现现在内置了查询缓存,因此只需使用现代版本的.NET,您就可以获得预编译查询为您提供的90%的好处。更不用担心改变代码结构以适应理论性能提升的原因。

答案 2 :(得分:2)

如果您有一次又一次地运行类似的查询,则可以通过编译来提高性能。

但有一些警告:http://omaralzabir.com/solving_common_problems_with_compiled_queries_in_linq_to_sql_for_high_demand_asp_net_websites/