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中提到下面两个提升性能的方法:app

使用 DbContext 池异步

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

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

// Create an explicitly compiled query
private 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 it
using (var db = new CustomerContext())
{
   var customer = _customerById(db, 147);
}

  

以上两种方式要在重复评估,性能测试以后再使用,由于已编译的查询在某些状况下可能并不会带来性能提高。工具

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