首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> ASP.NET 基礎 >> 關於ASP.NET

LINQ Count() vs Where().Count() 效能差異深度分析:從 35 秒優化到毫秒級

     編輯:關於ASP.NET

實戰案例:後台公司管理列表 4000 筆資料,新增「產品更新狀態」欄位後載入超過 35 秒。經 LINQPad 分析 SQL,發現 Count(predicate) 產生複雜 CASE WHEN SQL,改用 Where(predicate).Count() 產生簡潔 WHERE 子句,速度提升百倍。

問題重現

// 原始寫法:Count 帶條件 predicate
ContentStatus = Product_Maintain.Count(c => c.CompanyID == company.ID 
    && c.IsDeleted == 0 
    && (c.AuditStatus == 0 || c.AuditStatus == 4)) > 0 ? "產品有更新" : "";

產生 SQL (簡化):

SELECT COUNT(*) FROM (
    SELECT CASE 
        WHEN (CompanyID = @p0 AND IsDeleted = @p1 AND (AuditStatus = @p2 OR AuditStatus = @p3)) THEN 1
        ELSE 0
    END AS value
    FROM Company_Product_Maintain
) AS t WHERE t.value = 1
-- 執行 35 秒

優化後寫法

// 改用 Where 先篩選再 Count
ContentStatus = Product_Maintain.Where(c => c.CompanyID == company.ID 
    && c.IsDeleted == 0 
    && (c.AuditStatus == 0 || c.AuditStatus == 4)).Count() > 0 ? "產品有更新" : "";

產生 SQL:

SELECT COUNT(*) FROM Company_Product_Maintain
WHERE CompanyID = @p0 AND IsDeleted = @p1 AND (AuditStatus = @p2 OR AuditStatus = @p3)
-- 執行 < 100ms

根本原因分析

LINQPad 驗證步驟

  1. 安裝 LINQPad,連接資料庫
  2. 輸入兩種寫法的 LINQ 查詢
  3. 點擊 SQL 按鈕查看轉換後的 T-SQL
  4. 點擊 執行 對比實際耗時與執行計畫

擴充:其他常見 LINQ 效能陷阱

寫法LINQ to SQL 轉換策略SQL 特徵效能
Count(predicate)投影為 CASE WHEN → 外層 WHERE value=1子查詢 + CASE 分支 + 外層過濾掃描全表、無法有效使用索引
Where(predicate).Count()直接轉為 WHERE 子句單層 WHERE 過濾索引搜尋、極快
陷阱寫法優化寫法說明
.Where(x => x.List.Any(y => y.Id == id)).Where(x => x.List.Select(y => y.Id).Contains(id))Any 可能產生相關子查詢,Contains 可用 JOIN/IN
.Select(x => new { x.Id, Name = x.Child.Name }).Select(x => new { x.Id, x.Child.Name })匿名型別屬性名稱一致可省略賦值
foreach 迴圈中查詢 DB先 ToList() 取回記憶體再處理避免 N+1 查詢
.OrderBy(x => x.Date).Take(10)加上索引 .OrderBy(x => x.Date).Take(10)大表排序需索引支援

最佳實務原則

  1. 優先使用 Where().Count() / Where().Any(),避免 Count(predicate) / Any(predicate)
  2. 開發階段持續用 LINQPad 檢視 SQL,發現異常立即優化
  3. 大量資料報表查詢:考慮預先計算彙總欄位、Materialized View、快取
  4. 複雜查詢改用 Stored Procedure 或 Dapper,完全掌控 SQL

效能對比圖表

Count 35秒 vs Where.Count <100ms 效能對比

圖示:原始 Count(predicate) 35 秒 vs 優化後 Where().Count() 不到 100ms

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved