Entity Framework AsNoTracking 效能優化筆記

前言 在進行 Entity Framework 查詢時,當你執行的是「唯讀」操作,卻沒有使用 AsNoTracking() 時,效能會有差距。本篇記錄實際踩雷的經驗——當資料量小時還看不出來,但隨著資料成長,超過預設的 60 秒 Timeout 限制,導致排程工作失敗。 問題情景 某個 .NET Framework 排程工作,定期執行一份複雜的資料查詢: using (var db = new MyDbContext()) { var result = db.Orders .Where(o => o.Status == "Completed") .GroupBy(o => o.CustomerId) .Select(g => new { CustomerId = g.Key, TotalAmount = g.Sum(o => o.Amount), OrderCount = g.Count() }) .ToList(); // 處理 result... } 起初,資料量只有幾千筆,執行速度很快。但隨著程式修改,時間推移,累積到數十萬筆以上,這個查詢開始變得異常緩慢,最終超過預設的 60 秒 Timeout,排程執行失敗。 根本原因:Change Tracking Entity Framework 預設會追蹤查詢結果中的每一個實體: ...

February 11, 2026 · 1 分鐘