EF性能調優篇+輔助監控軟件
1、EF SQL監控工具
目前採用SQLServer 自帶的SQL Server Profiler
來監控執行的sql,
或者採用第三方插件MiniProfiler
,具體用法可以網上查一下。
2、EF使用SQlQuery 直接寫sql
EF效率低於ADO.NET是因爲LINQ-TO-SQL的過程消耗了時間。而使用SqlQuery則可以直接寫SQL語句。
當然,如果你想得到更快的執行速度,你也可以在數據庫上寫存儲過程proc
3、單純的數據查詢AsNoTracking()
EF使用AsNoTracking(),無跟蹤查詢技術(查詢出來的數據不可以進行修改)
例如:
var user = context.user.AsNoTracking().Where(A => A.Id == 1).FirstOrDefault() ;
student.Name = "小明";
context.SaveChanges();
最終不會更新數據庫的信息,所以我們在做數據集合查詢顯示,而又不需要對集合修改並更新到數據庫的時候,
一定不要忘記加上AsNoTracking。
如果查詢過程做了select映射就不需要加AsNoTracking。
如:db.user.Where(t=>t.Name.Contains("小明")).select(t=>new (t.Name,t.Age)).ToList();
4、 EF 使用 AsNonUnicode
示例:
using (BingFaTestEntities context = new BingFaTestEntities())
{
var a = context.User.AsNoTracking().Where(m => m.Name == DbFunctions.AsNonUnicode("小明")).ToList();
}
官方解釋:LINQ to Entities 運算符,它將輸入的字符串視爲非 unicode 字符串。
此方法僅適用於 LINQ to Entities 查詢。
作用:不加AsNonUnicode SQL中會有 N,加了AsNonUnicode後,SQL中沒有N ,使用 N 前綴(查詢過程中需要把數據庫默認格式轉化爲Unicode 格式來查詢,因此:性能被拉低)
當然如果查詢包含中文字符等建議不要使用該方法
5、EF查詢多字段組合排序
如果涉及多個字段排序不要都是使用 OrderBy,應該是第一個OrderBy後用ThenBy
示例:
var list = db.User.Where(m => m.Name.StartsWith("明")).OrderBy(m => m.Number).ThenBy(m => m.Name).ToList();
6、EF count(*)的問題(Any的用法)
場景:查詢用戶表中是否有小明這個用戶
var flag1=db.User.Where(m=>m.Name=="小明").Count()>0
var flag2=db.User.Where(m=>m.Name=="小明").FirstOrDefault()!=null
var flag3=db.User.Any(m=>m.Name=="小明").Count()>0
經過測試性能最高的是用Any 所以判斷是否存在儘量採用Any
7、EF的批量刪除和新增、修改_Entity Framework Extendeds
使用EF擴展 Entity Framework Extendeds
示例:
db.User.AddRange(list);//批量插入