您好,登錄后才能下訂單哦!
這篇文章主要講解了“EF Core如何通過顯式編譯提高查詢性能”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“EF Core如何通過顯式編譯提高查詢性能”吧!
在介紹具體內容之前,需要說明一點,EF Core已經對表達式的編譯使用了緩存;當您的代碼需要重用以前執行的查詢時,EF Core將使用哈希查找并從緩存中返回已編譯的查詢。
不過,您可能希望直接對查詢進行編譯,跳過哈希的計算和緩存查找。我們可以通過在EF
靜態類中下面兩個方法來實現:
EF.CompileQuery()
EF.CompileAsyncQuery()
這些方法允許您定義一個已編譯的查詢,然后通過調用一個委托調用它。
為了避免因為數據庫查詢產生測試結果的差異,我們這里使用內存數據庫,它開銷更小,同時也可以避免數據庫優化執行計劃以及緩存所帶來的問題。
定義實體
在這我們定義一個Category
實體類型,非常簡單,只有兩個屬性。
public class Category { public Guid Id { get; set; } public string Name { get; set; } }
數據庫DbContext
在FillCategories
方法中,將內存數據庫中增加三條記錄。
public class TestDbContext : DbContext { public TestDbContext(DbContextOptions<TestDbContext> options) : base(options) { } public DbSet<Category> Categories { get; set; } public void FillCategories() { var foodCategory = new Category { Id = Guid.NewGuid(), Name = "Food" }; Categories.AddRange(foodCategory, new Category { Id = Guid.NewGuid(), Name = "Drinks" }, new Category { Id = Guid.NewGuid(), Name = "Clothing" }, new Category { Id = Guid.NewGuid(), Name = "Electronis" }); SaveChanges(true); } }
public class CompileQueryTest { private Func<TestDbContext, Guid, Category> _getCategory = EF.CompileQuery((TestDbContext context, Guid id) => context.Categories.FirstOrDefault(c => c.Id == id)); private readonly TestDbContext _dbContext; public CompileQueryTest() { var options = new DbContextOptionsBuilder<TestDbContext>().UseInMemoryDatabase(Guid.NewGuid().ToString()).Options; var context = new TestDbContext(options); context.FillCategories(); _dbContext = context; } private readonly Guid _queryId = Guid.NewGuid(); [Benchmark] public void CompiledQuery() { _ = _getCategory(_dbContext, _queryId); } [Benchmark] public void UnCompiledQuery() { _ = _dbContext.Categories.FirstOrDefault(c => c.Id == _queryId); } }
為了更加接近測試結果,我們在構造函數中創建TestDbContext
對象以及填充數據庫。
我們使用Benchmark.Net進行基準測試,測試結果如下:
Method | Mean | Error | StdDev |
---|---|---|---|
CompiledQuery | 10.59 us | 0.0580 us | 0.0543 us |
UnCompiledQuery | 79.55 us | 0.7860 us | 0.7353 us |
感謝各位的閱讀,以上就是“EF Core如何通過顯式編譯提高查詢性能”的內容了,經過本文的學習后,相信大家對EF Core如何通過顯式編譯提高查詢性能這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。