[英]EF precompiled views and custom query
我正在嘗試增加EF查詢的“第一次調用”執行時間,並發現可以使用預編譯視圖進行查詢。 在我使用VS庫中的T4模板生成預編譯視圖后,稱為“EF代碼首先預生成的C#視圖生成器”,我沒有注意到一些重度查詢(包含和連接)的任何性能提升。
然后我嘗試通過t4模板調查生成的代碼。 我在DbMappingViewCache
看到了一個類,它通過其方法GetView(EntitySetBase extent)
返回請求的DbMappingView
。
看起來所有這些視圖都只適用於簡單查詢,所以我問自己是否有任何方法可以在預編譯階段為我的特定繁重查詢緩存視圖。 有誰知道如何實現這一目標? 有可能嗎?
看看這個博客后 ,其談論一些方法來減少啟動時間。
以供參考:
使用緩存的db模型存儲
這可能是對啟動性能的最大影響,只有在使用代碼優先模型時才有必要。 使用Code First管道構建和編譯大型模型在啟動時非常昂貴。 此步驟將緩存代碼優先的管道及其昂貴的oc映射生成,並將其存儲在文件系統上的xml文件中。 下次啟動應用程序時,EF將反序列化此緩存的映射文件,從而顯着縮短啟動時間。
生成預編譯的視圖:
您已經這樣做了,但也要看一下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沒有特別的關系,但這里的一個技巧一般適用於任何查詢。 我們的想法是通過應用程序初始化模塊預熱您的應用程序 。 因此,在web.config中添加此項將導致此模塊向/startup
路由發送請求以執行初始化。
<applicationInitialization
doAppInitAfterRestart="true" >
<add initializationPage="/startup" />
</applicationInitialization>
使用此視圖( /startup
),您可以為測試用戶激發繁重的查詢(假設只讀),這將導致EF執行所有啟動初始化。
有關保持應用程序池始終運行的其他提示,請參閱此答案 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.