张亚飞 发表于 2023-4-29 12:11:12

efcore性能调优

性能调优——EFCore调优
按下硬件、网络不提,我们单表从程序层面对系统的性能进行优化,翻来覆去无外乎三个方面
缓存
      异步
      sql
本片文章,我们针对.net core web项目的ef core框架进行性能优化。
1. EF Core框架已经本地缓存机制memorycache,所以我们访问一个接口,二次访问的性能相比首次会提升一大截
2.尽可能的通过主键查询
3.在进行字符串模糊查询时,分为三种情况
//StartsWith,相当于sql语句的like 'A%'
var result= ProductContext.Products.Where(p => p.ProductName.StartsWith("A")).ToList();

//EndsWith,相当于sql语句的like '%A'
var result= ProductContext.Products.Where(p => p.ProductName.EndsWith("A")).ToList();

//Contains,相当于sql语句的like '%A%'
var result= ProductContext.Products.Where(p => p.ProductName.Contains("A")).ToList();
其中的Contains()会导致索引失效,不建议使用
4.指定列查询。即字段查询、传输需要时间,字段越多,所需的时间就越多,所以我们可以指定我们所需的字段
ProductContext.Products.Select(p =>new { p.ProductId, p.ProductName})
对应的sql为:
select ProductId,ProductName
from Products
5.分页查询(常用于客户端查询)
int pageIndex = 1;
int pageSize = 10;

var result= ProductContext.Products
                .Where(p => p.ProductName.StartsWith("A"))
                .Take(pageSize) // 限制结果集数量。
                .Skip((pageIndex - 1) * pageSize) // 数据的偏移量
                .ToList();
6.一次性查询数据量较多时(如导出报表),借助缓冲区处理,即直接ToList()、ToArray()
   ps:某些时候使用缓冲区而不是缓存,是因为缓冲区使用时会清空,而缓存不到过期时间不自动清空,某些场景下会浪费内存空间
//默认流式处理,遍历使用result时每次循环都会查询数据库
var result= ProductContext.Products.Where(p => p.ProductName.StartsWith("A"));

//缓冲区处理(一次性将数据查出,使用result时,直接从队列中取数据)
var result= ProductContext.Products.Where(p => p.ProductName.StartsWith("A")).ToList();
7.EFCore会对查询出来的数据进行缓存、跟踪。跟踪监控造成额外的空间浪费,但能方便更新数据,所以在不涉及修改的情况下(只查询时),我们可以用AsNoTracking()方法来手动关闭跟踪
var result= ProductContext.Products
            .Where(p => p.ProductName.StartsWith("A"))
            .AsNoTracking()
            .ToList();
8.使用异步   ToListAsync()
—————————以上为单个表数据的efcore优化—————————

原文链接:https://blog.csdn.net/YangWeiKe/article/details/130351397

来源:https://www.cnblogs.com/wugh8726254/archive/2023/04/29/17363553.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!
页: [1]
查看完整版本: efcore性能调优