摘要:我们遇到了EF4查询编译时间超过12秒的问题。缓存查询只会让我们到目前为止;有什么办法可以减少编译时间吗?有什么我们可能做错了,我们可以寻找?谢谢!如何减少Entity Framework 4查询编译时间?
我们有一个暴露在WCF服务上的EF4模型。对于我们的每个实体类型,我们公开一个方法来获取并返回整个实体进行显示/编辑,包括一些引用的子对象。
对于一个特定实体,我们必须包含()31个表/子表以返回所有相关数据。不幸的是,这使得EF查询编译非常慢:编译和构建7,800行,300K查询需要12-15秒。这是网络用户界面的后端,需要比这更快捷。
有什么我们可以做的改善呢?我们可以CompiledQuery.Compile这个 - 在第一次使用之前不做任何工作,所以可以帮助第二次和随后的执行,但是我们的客户很紧张,第一次使用也不应该慢。同样,如果托管Web服务的IIS应用程序池得到回收,我们将失去缓存的计划,尽管我们可以延长生命周期以尽量减少这种情况。另外我也看不到预先编译这种方法和/或串行化EF编译查询缓存(缺少反射技巧)的方法。 CompiledQuery对象只包含一个GUID引用到缓存中,所以它就是我们真正关心的缓存。 (写出来,它发生在我身上,我可以从app_startup启动背景中的某些东西来执行所有查询以便编译它们 - 这是否安全?)
但是,即使我们确实解决了这个问题,我们也建立了我们的搜索根据我们正在搜索的参数,使用LINQ-to-Entities子句动态查询:我不认为SQL生成器做了足够好的工作,以至于我们可以将所有逻辑移入SQL层,所以我不认为我们可以预编译我们的搜索查询。这不太严重,因为搜索数据结果使用较少的表,因此仅编译12-15小时只需3-4秒,但客户认为终端用户仍然不能接受。
所以我们真的需要以某种方式减少查询编译时间。有任何想法吗?
- 分析点到ELinqQueryState.GetExecutionPlan作为开始的地方,我试图踏进那个,但没有提供真正的.NET 4源我不能走得很远,并通过反射器产生的源荣获”让我进入一些功能或设置断点。
- 该项目从.NET 3.5升级,所以我试图在EF4中从零开始重新生成EDMX,以防出现问题但没有帮助。
- 我试过在这里做广告的EFProf实用程序,但它看起来并不像它对此有帮助。无论如何,我的大型查询会使其数据收集器崩溃。
- 我已经通过SQL性能调整运行生成的查询,它已经有100%的索引使用率。我看不到任何会导致查询生成器问题的数据库错误。
- 执行计划编译器中是否存在O(n^2) - 是否将此分解为单独的数据加载块,而不是一次可能帮助的所有32个表?将EF设置为延迟加载没有帮助。
- 我已经购买了预发布的O'Reilly Julie Lerman EF4书,但是我找不到任何内容来帮助“编译你的查询”。
我不明白为什么需要12-15秒才能在32个表格中生成单个选择,所以我很乐观有一些改进的空间!
感谢您的任何建议!我们正在针对SQL Server 2008运行,以防使用RTM VS2010的XP/7/server 2008 R2。
我们也有这个问题,这是一个主要问题。执行查询的时间最多为2-300毫秒,而等待ELinqQueryState.GetExecutionPlan()需要8-9秒。这是在将EF无法处理的大型热切加载查询(用于每个qry需要2-4分钟等待ELinqQueryState.GetExecutionPlan())分解为许多更简单的热切加载查询之后。我想我们所能做的就是等待EF5,这应该可以缓解由此造成的一些痛苦。 – Mahol25 2012-02-16 12:08:34
我已发布在msdn.forums关于这个问题,希望得到一些指导,在这里http://social.msdn.microsoft.com/Forums/en-US/adodotnetentityframework/thread/055c5b55-2d2a-4298- a28c-32737c57ad8d – Mahol25 2012-02-16 14:25:21
@ Mahol25谢谢 - 我会看那个帖子。我很抱歉地说,在我离开项目之前,我们从来没有把我们的疑问降低到一秒以内,所以我没有任何具体的建议让你超越已有的东西。 – Rup 2012-02-16 17:55:47