EntityFramework Core 2.0 Explicitly Compiled Query(顯式編譯查詢)

前言

EntityFramework Core 2.0引入了顯式編譯查詢,在查詢數據時預先編譯好LINQ查詢便于在請求數據時能夠立即響應。顯式編譯查詢提供了高可用場景,通過使用顯式編譯的查詢可以提高查詢性能。EF Core已經使用查詢表達式的散列來表示自動編譯和緩存查詢,當我們的代碼需要重用以前執行的查詢時,EF Core將使用哈希查找并從緩存中返回已編譯的查詢。我們更希望直接使用編譯查詢繞過散列計算和高速緩存查找。

EntityFramework Core 2.0顯式編譯查詢

比如我們要從博客實體中通過主鍵查詢博客同時饑餓加載發表文章的集合列表,如下:

            var id = 1;using (var context = new EFCoreDbContext()){var blog = context.Blogs.AsNoTracking().Include(c => c.Posts).Where(c => c.Id == id).FirstOrDefault();}

當進行上述查詢時,此時要經過編譯翻譯階段最終返回實際結果,比如在Web網站上這樣的請求很頻繁,此時將嚴重影響響應速度導致頁面加載數據過慢。從Web程序應用角度來看我們大可利用ASP.NET Core中的響應式緩存,在實際應用中我們會將查詢封裝為方法來使用,我們無法優化結果和查詢方式,但是我們能夠通過編譯查詢來提前保存好數據以達到緩存的效果。通過EF靜態類中的擴展方法CompileQuery來實現。如下:

        static async Task<Blog> GetBlogAsync(EFCoreDbContext context, int id){Func<EFCoreDbContext, int, Task<Blog>> blog = EF.CompileAsyncQuery((EFCoreDbContext context, int Id) =>context.Blogs.Include(c => c.Posts).Where(c => c.Id == Id).FirstOrDefault());return await blog(context, id);}

常規查詢和顯式編譯查詢性能比較

接下來我們測試常規查詢和使用顯式編譯查詢的性能,我們利用EF Core提供的內存數據庫來測試避免使用SQL Server數據庫,利用SQL Server數據庫很難去比較二者性能問題,因為數據庫會進行查詢計劃優化和緩存,利用內存數據庫只知道當前執行的查詢不會進行任何優化, 首先我們下載EF Core內存數據庫。額外再說明一點內存數據庫在進行單元測試時很有意義。

接下來我們首先測試常規查詢,我們預先在內存數據庫中創建50條記錄,然后查詢十萬次數據,這樣來看每一次查詢都會再次重新編譯。

        public static void Main(string[] args){var options = new DbContextOptionsBuilder<EFCoreDbContext>().UseInMemoryDatabase(Guid.NewGuid().ToString()).Options;var context = new EFCoreDbContext(options);var stopWatch = new Stopwatch();FillBlogs(context);stopWatch.Start();for (var i = 0; i < 1000000; i++){GetUnCompileQueryBlog(context);}stopWatch.Stop();Console.Write("Compiling time:");Console.WriteLine(stopWatch.Elapsed);Console.ReadKey();}static void FillBlogs(EFCoreDbContext context){for (var i = 0; i < 50; i++){context.Blogs.Add(new Blog{Name = "Jeffcky",CreatedTime = DateTime.Now,Url = "http://www.cnblogs/com/CreateMyself",ModifiedTime = DateTime.Now,Posts = new List<Post>(){new Post(){CommentCount = i, CreatedTime = DateTime.Now,ModifiedTime = DateTime.Now, Name = "EF Core"}}});}context.SaveChanges(true);}static Blog GetUnCompileQueryBlog(EFCoreDbContext context){return context.Blogs.Include(c => c.Posts).OrderBy(o => o.Id).FirstOrDefault();}

我們看到上述利用常規查詢總耗時27秒,接下來我們再來看看顯式編譯查詢耗時情況。

private static Func<EFCoreDbContext, Blog> _getCompiledBlog = EF.CompileQuery((EFCoreDbContext context) =>context.Blogs.Include(c => c.Posts).OrderBy(o => o.Id).FirstOrDefault());
            var options = new DbContextOptionsBuilder<EFCoreDbContext>().UseInMemoryDatabase(Guid.NewGuid().ToString()).Options;var context = new EFCoreDbContext(options);var stopWatch = new Stopwatch();FillBlogs(context);stopWatch.Start();for (var i = 0; i < 100000; i++){GetCompileQueryBlog(context);}stopWatch.Stop();Console.Write("Compiling time:");Console.WriteLine(stopWatch.Elapsed);Console.ReadKey();

如上通過顯式編譯查詢耗時16秒,那么是不是就說明顯式編譯查詢性能一定優于常規查詢呢?顯然不是這樣,上述只是簡單的測試方法,有可能運行多次顯式編譯查詢性能還低于常規查詢,所以上述簡單的測試方法并不能看出常規查詢和顯式編譯查詢之間的性能差異,當查詢基數足夠大時則能通過機器明顯看出二者之間的性能差異,這也就說明了為什么EntityFramework Core官方文檔說明顯式編譯查詢的高可用。但是顯式編譯查詢還有且缺點,當我們進行如下查詢呢?

        public static void Main(string[] args){var options = new DbContextOptionsBuilder<EFCoreDbContext>().UseInMemoryDatabase(Guid.NewGuid().ToString()).Options;var context = new EFCoreDbContext(options);var blogs = GetCompileQueryBlogs(context);Console.ReadKey();}static Blog[] GetCompileQueryBlogs(EFCoreDbContext context){Func<EFCoreDbContext, Blog[]> func = EF.CompileQuery((EFCoreDbContext db) =>db.Blogs.Include(c => c.Posts).OrderBy(o => o.Id).ToArray());return func(context);}}

當前EntityFramework Core 2.0.1版本對于顯式編譯查詢還不支持返回IEnumerable<T>, IQueryable<T>的集合類型,期待未來能夠有所支持。

總結缺陷

顯式編譯查詢提供高可用場景,但是仍然存在其缺陷,期待未來能有更多支持,希望給閱讀的您一點幫助。精簡的內容,簡單的講解,希望對閱讀的您有所幫助,我們明天再會。

轉載于:https://www.cnblogs.com/CreateMyself/p/8519512.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/539212.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/539212.shtml
英文地址,請注明出處:http://en.pswp.cn/news/539212.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Oracle Minus關鍵字 不包含 取差集

Oracle Minus關鍵字   SQL中的MINUS關鍵字   SQL中有一個MINUS關鍵字&#xff0c;它運用在兩個SQL語句上&#xff0c;它先找出第一條SQL語句所產生的結果&#xff0c;然后看這些結果有沒有在第二個SQL語句的結果 中。如果有的話&#xff0c;那這一筆記錄就被去除&#xff0…

python掃描器甄別操作系統類型_20189317 《網絡攻防技術》 第三周作業

一.教材內容總結1.網絡踩點&#xff1a;web搜索與挖掘、DNS和IP查詢、網絡拓撲偵察(1)網絡踩點目標確定(2)技術手段&#xff1a;web信息搜索與挖掘、DNS和IP查詢、網絡拓撲偵察(3)web信息搜索與挖掘&#xff1a;基本搜索與挖掘技巧、高級搜索與挖掘技巧、編程實現google搜索、元…

python 網頁重定向_小試牛刀:python爬蟲爬取springer開放電子書.

首先聲明,本文旨在記錄反思,并沒有資源,代碼也不具有借鑒意義(水平實在不行.某天,水群的時候發現群友發了一個文件,里面是疫情時期springer開放的免費電子書名單,同時還附有下載鏈接,總共有400多本,這要是一個一個下載不得累死個人,只下載自己感興趣的書也是一個好主意,但是,我…

直面桌面云帶來的現狀優勢

在桌面云解決方案里&#xff0c;首先&#xff0c;所有的數據以及運算都在服務器端進行&#xff0c;客戶端只是顯示其變化的影像而已&#xff0c;所以在不需要擔心客戶端來非法竊取資料&#xff0c;我們在電影里面看到的商業間諜拿著 U 盤瘋狂的拷貝公司商業機密的情況再也不會出…

ORA-28001: the password has expired解決方法

Oracle提示錯誤消息ORA-28001: the password has expired&#xff0c;是由于Oracle11G的新特性所致&#xff0c; Oracle11G創建用戶時缺省密碼過期限制是180天&#xff08;即6個月&#xff09;&#xff0c; 如果超過180天用戶密碼未做修改則該用戶無法登錄。 Oracle公司是為了數…

.net 導出excel_Qt編寫的項目作品18-數據導出到Excel及Pdf和打印數據

一、功能特點原創導出數據機制&#xff0c;不依賴任何office組件或者操作系統等第三方庫&#xff0c;尤其是支持嵌入式linux。10萬行數據9個字段只需要2秒鐘完成。只需要四個步驟即可開始急速導出大量數據到Excel。同時提供直接寫入數據接口和多線程寫入數據接口&#xff0c;不…

hive數據庫定義

默認數據庫"default" 可以顯式切換數據庫&#xff1a;hive> use 數據庫名; 創建 hive>CREATE DATABASE [IF NOT EXISTS] mydb [LOCATION] /....... [COMMENT] ....; 實例 hive (default)> create database test_db comment test database; OK Ti…

圖像增強_Keras 常用的圖像增強方式

歡迎關注 “小白玩轉Python”&#xff0c;發現更多 “有趣”在使用神經網絡和深度學習模型時&#xff0c;需要進行數據準備。對于更復雜的物體識別任務&#xff0c;也越來越需要增加數據量。數據增加意味著增加數據量。換句話說&#xff0c;擁有更大的數據集意味著更健壯的模型…

Facebook產品經理的三年敘事與協作思考

產品經理和研發工程師的關系經常被大家調侃&#xff0c;可偏偏就有同時受到研發和設計都喜歡的“別人家的產品經理”&#xff0c;溝通協調、對接需求、項目把控面面俱到還有好人緣。有沒有人天生就是產品經理&#xff1f;產品經理的工作就是寫需求寫需求和寫需求么&#xff1f;…

sis新地址_堅若磐石不掉速,老平臺升級新選擇,入手昱聯Asint 500G SSD

我是文章的原作者&#xff0c;文章首發于&#xff1a;什么值得買愛折騰的老狐貍?zhiyou.smzdm.com首發文章鏈接&#xff1a;堅若磐石不掉速&#xff0c;老平臺升級新選擇&#xff0c;入手昱聯Asint 500G SSD _值客原創_什么值得買?post.smzdm.com雖然說&#xff0c;現在越來越…

hive表定義(3種方式)

創建表 方式一 建表語法 CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name [(col_name data_type [COMMENT col_comment], ...)] [COMMENT table_comment] [PARTITIONED BY (col_name data_type [COMMENT col_comment], ...)] [CLUSTERED BY (col_name, col_name, ..…

進度條設置_為你的練習設置進度條

在我們的日常練習中&#xff0c;遇到最多的一個問題就是不知道自己練得怎么樣了&#xff1f;還需不需要繼續&#xff0c;或者調整練習方法。這種問題大多出現在自學吉他的學生當中&#xff0c;因為得不到老師的反饋&#xff0c;自己練得對不對&#xff0c;夠不夠&#xff0c;都…

Python之路(第二篇):Python基本數據類型字符串(一)

一、基礎1、編碼 UTF-8:中文占3個字節 GBK&#xff1a;中文占2個字節 Unicode、UTF-8、GBK三者關系 ascii碼是只能表示英文字符&#xff0c;用8個字節表示英文&#xff0c;unicode是統一碼&#xff0c;世界通用碼&#xff0c;規定采用2個字節對世界各地不同文字進行編碼&#x…

python ftp下載文件_文件上傳下載Python

點擊上方藍字關注我&#xff01;圖片來源 pexels.com簡單實現文件上傳、下載1 Server端 # -*- coding: utf-8 -*-import jsonimport os__author__ sange# Time : 2020/8/17 下午5:26# Author : sange# File : tcpserver_socket.py# Software: PyCharmimport socketserv…

hive列定義

修改 列的名稱、類型、位置、注釋 hive>ALTER TABLE t3 CHANGE COLUMN old_name new_name String [COMMENT ...] [AFTER column2]; 實例 hive (zmgdb)> alter table t1 change column car sarly int after office; FAILED: Execution Error, return code 1 from org.a…

react json轉換_Typescript + React 新手篇

極鏈科技前端工程師茅丹丹前言 TS是什么Type Type (標準JS)。TS的官方網站&#xff1a;Type is a typed superset of Java that compiles to plain Java。Type是一個編譯到純JS的有類型定義的JS超集。 TS優點 TS 最大的優勢是它提供了強大的靜態分析能力&#xff0c;結合 TSL…

android listview 滑動條顯示_第七十六回:Android中UI控件之RecyclerView基礎

各位看官們&#xff0c;大家好&#xff0c;上一回中咱們說的是Android中UI控件之ListView優化的例子&#xff0c;這一回咱們說的例子是UI控件之RecyclerView。閑話休提&#xff0c;言歸正轉。讓我們一起Talk Android吧&#xff01;看官們&#xff0c;我們在前面章回中介紹了Lis…

數據建模大數據就業挑戰月薪30K

點擊關注 異步圖書&#xff0c;置頂公眾號每天與你分享 IT好書 技術干貨 職場知識本文大概 10624 字讀完共需 30 分鐘Tips 參與文末話題討論&#xff0c;即有機會獲得異步圖書一本。數據建模是對現實世界各類數據進行抽象組織、界定數據庫需管轄的范圍、確定數據的組織形式等直…

Hive的數據模型-管理表

概述 管理表&#xff0c;也稱作內部表,受控表。 所有的 Table 數據&#xff08;不包括 External Table&#xff09;都保存在warehouse這個目錄中。 刪除表時&#xff0c;元數據與數據都會被刪除。 在加載數據的過程中&#xff0c;實際數據會被移動到數據倉庫目錄中&#xff1b…

mft按鈕設計_火力發電廠典型MFT邏輯控制實現.pdf

火力發電廠典型MFT邏輯控制實現.pdf火力發電廠典型MFT邏輯控制實現劉文豐 陳思銘湖南省電力試驗研究院 (湖南長沙410007)摘要&#xff1a;以金竹山電廠擴建工程國產2600MW亞臨界機組為例&#xff0c;概述了必力發電廠FSSS中典型MFT的原理及重要性&#xff0c;詳細介紹各MFT條件…