程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> ASP.NET >> 關於ASP.NET >> Cont()與Where().Count()有時性能差別如此之大

Cont()與Where().Count()有時性能差別如此之大

編輯:關於ASP.NET

今天在修改後台用戶公司管理列表時,發現列表加載超慢的bug!好幾十秒啊!數據是相對其他的列表 是稍微多點,不過也就4000多條,之前是好的,為啥這麼慢呢?想起我之前在此列表中加入了一個字段, 用於方便提示管理員公司的產品列表是否有修改之類的狀態字段,於是可以斷定是加了此字段的原因。

首先,先看看我之前是如何寫這個提示狀態字段的,實體中加入ContentStatus,然後直接在Linq語句 中Select 實體對象中加入ContentStatus=Product_Maintain.Count(C => C.CompanyID == company.ID && C.IsDeleted == 0 && (C.AuditStatus == 0 || C.AuditStatus == 4))>0?"產品有更新":""。這時我想應該是加入三元運算,linq在轉Sql時,產生過多的,Case,when ,then語句,三元運算增加了判斷會影響查詢性能,於是我去掉後,再運行查看頁面,仍然很慢,感覺不 出快了多少。

這時,我想起了LinqPad,看看到底轉換生成了怎樣的Sql語句。運用Count(條件)生成Sql代碼如下 :

SELECT COUNT(*) AS [value]
     FROM (
         SELECT
             (CASE
                 WHEN ([t1].[CompanyID] = ([t0].[ID])) AND ([t1]. [IsDeleted] = @p0) AND (([t1].[AuditStatus] = @p1) OR ([t1].[AuditStatus] = @p2))  THEN 1
                 WHEN NOT (([t1].[CompanyID] = ([t0].[ID])) AND  ([t1].[IsDeleted] = @p0) AND (([t1].[AuditStatus] = @p1) OR ([t1].[AuditStatus] =  @p2))) THEN 0
                 ELSE NULL
              END) AS [value]
         FROM [Company_Product_Maintain] AS [t1]
         ) AS [t2]
     WHERE [t2].[value] = 1

這時我發現一個很簡單的Count的Sql 語句,linq轉換後變得如此復雜,我直接在sql server中運行此 代碼,發現查詢還是很慢,於是我直接把ContentStatus=Product_Maintain.Where(C => C.CompanyID == company.ID && C.IsDeleted == 0 && (C.AuditStatus == 0 || C.AuditStatus == 4)).Count()生成Sql語句為:

SELECT COUNT(*) AS [value]
     FROM [GasSNS_Company_Equipment_Maintain] AS [t1]
     WHERE ([t1].[CompanyID] = ([t0].[ID])) AND ([t1].[IsDeleted] = @p0) AND  (([t1].[AuditStatus] = @p1) OR ([t1].[AuditStatus] = @p2))

發現運行速度那是快了一個數量級啊!

後台列表查詢結果速度大大提升有圖為證(聲明:以下圖都為項目中截圖,不是簡單的單表查詢,還連 了用戶表,詳細表等數量也都挺大的):

圖1為Count結果,用了35秒,哇塞!

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved