優化資料訪問和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 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或其他分析工具,分析資料訪問耗時來發現,大多數資料庫會提供頻繁查詢的統計資訊,可以幫助開發人員進行分析,
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/106103.html
標籤:.NET技术
下一篇:Autofac的使用
