2020-09-18

ASP.NET Core 性能最佳实践(三)优化数据访问和I/O操作

优化数据访问和I/O操作

数据交互以及远程服务通常是程序中最慢的部分,高效的读写数据对性能尤其重要。

建议操作:

  • 异步方式调用所有数据访问API。
  • 不要获取非必须的数据,近返回当前Http 请求需要的数据。
  • 在数据过期是可接受的情况下,可以考虑缓存频繁访问的数据(从数据库中读取或远程服务返回的数据)。根据实际应用场景,可以使用内存缓存(MemoryCache)或分布式缓存(DistributedCache)。
  • 减少网络往返。也就是说尽量一次请求返回所需数据,避免多次请求。
  • 使用Entity Framework Core时,如果只是读取数据,可以用非跟踪查询模式(no-tracking queries),这样可以提升查询性能。
  • 使用Linq 查询时,可使用 Where.Select.Sum 等方法过滤或聚合查询,从而在数据库中进行过滤。
  • 一定要注意EF Core在客户端的某些查询解析,可能无效。(某些自定义的匹配条件)详情查看: Client evaluation performance issues.
  • 不要在集合上使用映射查询,会导致N+1查询问题。详情查看:Optimization of correlated subqueries.

在高性能EF中提到下面两个提高性能的方法:

使用 DbContext 池

services.AddDbContextPool<BloggingContext>( options => options.UseSqlServer(connectionString));

使用已编译的查询(compiled query)

// Create an explicitly compiled queryprivate static Func<CustomerContext, int, Customer> _customerById = EF.CompileQuery((CustomerContext db, int id) =>  db.Customers   .Include(c => c.Address)   .Single(c => c.Id == id));// Use the compiled query by invoking itusing (var db = new CustomerContext()){ var customer = _customerById(db, 147);}

  

以上两种方式要在重复评估,性能测试之后再使用,因为已编译的查询在某些情况下可能并不会带来性能提升。

查询性能问题可以通过Application Insights或其他分析工具,分析数据访问耗时来发现。大多数数据库会提供频繁查询的统计信息,可以帮助开发人员进行分析。


原文转载:http://www.shaoqun.com/a/476420.html

tradekey:https://www.ikjzd.com/w/1630
斑马物流:https://www.ikjzd.com/w/1316
欧苏丹:https://www.ikjzd.com/w/1756
官方助力抢购物车?亚马逊又出新功能,卖家哭了:https://www.ikjzd.com/home/112109
7月1日起:深圳、广州、宁波这些操作要了解!:https://www.ikjzd.com/home/99544
4KMILES:https://www.ikjzd.com/w/2086

优化数据访问和I/O操作数据交互以及远程服务通常是程序中最慢的部分,高效的读写数据对性能尤其重要。建议操作:异步方式调用所有数据访问API。不要获取非必须的数据,近返回当前Http请求需要的数据。在数据过期是可接受的情况下,可以考虑缓存频繁访问的数据(从数据库中读取或远程服务返回的数据)。根据实际应用场景,可以使用内存缓存(MemoryCache)或分布式缓存(DistributedCache)。
易趣:https://www.ikjzd.com/w/210
易速:https://www.ikjzd.com/w/2389
prezi:https://www.ikjzd.com/w/1751
欧美各站点促销引流网站集锦:https://www.ikjzd.com/tl/5150
亚马逊卖家发起成立在线商家协会,矛头直指销售税!:https://www.ikjzd.com/home/370
深度解析海外美妆市场各个维度!:https://www.ikjzd.com/home/106426

No comments:

Post a Comment