欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

EF?Core通過顯式編譯提高查詢性能

 更新時間:2022年02月22日 16:17:39   作者:Sweet-Tang  
這篇文章介紹了EF?Core通過顯式編譯提高查詢性能的方法,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下

今天,我將向您展示這些EF Core中一個很酷的功能,通過使用顯式編譯的查詢,提高查詢性能。

不過在介紹具體內(nèi)容之前,需要說明一點,EF Core已經(jīng)對表達式的編譯使用了緩存;當您的代碼需要重用以前執(zhí)行的查詢時,EF Core將使用哈希查找并從緩存中返回已編譯的查詢。

不過,您可能希望直接對查詢進行編譯,跳過哈希的計算和緩存查找。我們可以通過在EF靜態(tài)類中下面兩個方法來實現(xiàn):

  • EF.CompileQuery()
  • EF.CompileAsyncQuery()

這些方法允許您定義一個已編譯的查詢,然后通過調(diào)用一個委托調(diào)用它。

為了避免因為數(shù)據(jù)庫查詢產(chǎn)生測試結(jié)果的差異,我們這里使用內(nèi)存數(shù)據(jù)庫,它開銷更小,同時也可以避免數(shù)據(jù)庫優(yōu)化執(zhí)行計劃以及緩存所帶來的問題。

實體定義以前數(shù)據(jù)庫DbContext

定義實體

在這我們定義一個Category實體類型,非常簡單,只有兩個屬性。

    public class Category
    {
        public Guid Id { get; set; }
        public string Name { get; set; }
    }

數(shù)據(jù)庫DbContext

FillCategories方法中,將內(nèi)存數(shù)據(jù)庫中增加三條記錄。

    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);

        }
    }

為了更加接近測試結(jié)果,我們在構(gòu)造函數(shù)中創(chuàng)建TestDbContext對象以及填充數(shù)據(jù)庫。

測試結(jié)果

我們使用Benchmark.Net進行基準測試,測試結(jié)果如下:

MethodMeanErrorStdDev
CompiledQuery10.59 us0.0580 us0.0543 us
UnCompiledQuery79.55 us0.7860 us0.7353 us

經(jīng)過編譯的查詢比未編譯過的查詢存在接近8倍的差距。如果您對這個功能感興趣,不防自己測試一下。

到此這篇關(guān)于EF Core通過顯式編譯提高查詢性能的文章就介紹到這了。希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

最新評論