我试图增加"第一次通话"我的EF查询的执行时间,并发现可以使用预编译的视图进行查询。在我使用VS库中的T4模板生成预编译视图后,称为"用于C#"的EF代码优先预生成视图生成器,我没有注意到一些重度查询的性能提升(包含和加入)。
然后我尝试通过t4模板调查生成的代码。我在DbMappingViewCache
看到了一个下降的类,它通过方法DbMappingView
返回请求的GetView(EntitySetBase extent)
。
看起来所有这些视图都只适用于简单查询,因此我问自己是否有任何方法可以在预编译阶段为我的特定繁重查询缓存视图。有谁知道如何实现这一目标?它有可能吗?
答案 0 :(得分:3)
查看此博客post,其中讨论了缩短启动时间的几种方法。
供参考:
使用缓存的数据库模型商店
这可能是对启动性能的最大影响,只有在使用代码优先模型时才有必要。使用Code First管道构建和编译大型模型在启动时非常昂贵。此步骤将使用其昂贵的o-c映射生成缓存代码优先管道,并将其存储在文件系统上的xml文件中。下次启动应用程序时,EF将对此缓存的映射文件进行反序列化,从而显着缩短启动时间。
生成预编译的视图:
你已经在做了,但也看看Interactive Pre Generated Views for Entity Framework 6,你可以预编译视图并缓存它们,而不会因为增加构建时间而陷入困境。
使用n-gen生成实体框架的预编译版本以避免抖动
实体框架没有出现在.net Framework的默认安装中。因此,EF程序集默认不是NGEN,这意味着每次应用程序启动时都需要对EF代码进行JITTED。由于EF是一个非常大且复杂的框架(EntityFramework程序集超过5MB),并且即使对于简单的场景也需要大多数代码路径,因此JITTING对启动性能有显着影响。
针对EF运行NGEN就像在根终端会话中执行以下命令一样简单:
%WINDIR%\Microsoft.NET\Framework\v4.0.30319\ngen install EntityFramework.dll
虽然与EF没有特别的关系,但这是一个通常适用于任何查询的技巧。我们的想法是通过Application Initialization Module来预热您的应用。因此,在web.config中添加此项将导致此模块向/startup
路由发送请求以执行初始化。
<applicationInitialization
doAppInitAfterRestart="true" >
<add initializationPage="/startup" />
</applicationInitialization>
使用此视图(/startup
),您可以为测试用户激发繁重的查询(假设其只读),这将导致EF执行所有启动初始化。
请参阅此answer了解有关确保应用池始终正常运行的其他提示。