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或其餘分析工具,分析數據訪問耗時來發現。大多數數據庫會提供頻繁查詢的統計信息,能夠幫助開發人員進行分析。性能

相關文章
相關標籤/搜索