Cont()與Where().Count()有時(shí)性能差別如此之大!
首先,先看看我之前是如何寫這個(gè)提示狀態(tài)字段的,實(shí)體中加入ContentStatus,然后直接在Linq語句中Select 實(shí)體對(duì)象中加入ContentStatus=Product_Maintain.Count(C => C.CompanyID == company.ID && C.IsDeleted == 0 && (C.AuditStatus == 0 || C.AuditStatus == 4))>0?"產(chǎn)品有更新":""。這時(shí)我想應(yīng)該是加入三元運(yùn)算,linq在轉(zhuǎn)Sql時(shí),產(chǎn)生過多的,Case,when ,then語句,三元運(yùn)算增加了判斷會(huì)影響查詢性能,于是我去掉后,再運(yùn)行查看頁面,仍然很慢,感覺不出快了多少。
這時(shí),我想起了LinqPad,看看到底轉(zhuǎn)換生成了怎樣的Sql語句。運(yùn)用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
這時(shí)我發(fā)現(xiàn)一個(gè)很簡(jiǎn)單的Count的Sql 語句,linq轉(zhuǎn)換后變得如此復(fù)雜,我直接在sql server中運(yùn)行此代碼,發(fā)現(xiàn)查詢還是很慢,于是我直接把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))
發(fā)現(xiàn)運(yùn)行速度那是快了一個(gè)數(shù)量級(jí)??!
后臺(tái)列表查詢結(jié)果速度大大提升有圖為證(聲明:以下圖都為項(xiàng)目中截圖,不是簡(jiǎn)單的單表查詢,還連了用戶表,詳細(xì)表等數(shù)量也都挺大的):
圖1為Count結(jié)果,用了35秒,哇塞!

圖2為Where(條件).Count()結(jié)果,同樣的數(shù)據(jù)只用了4秒鐘,差了10倍!

然后為了取值方面我還是加入三元運(yùn)算,ContentStatus=Product_Maintain.Where(C => C.CompanyID == company.ID && C.IsDeleted == 0 && (C.AuditStatus == 0 || C.AuditStatus == 4)).Count()>0?"產(chǎn)品有更新":""。結(jié)果如下:

SELECT COUNT(*) AS [value]
FROM [GasSNS_Company_Equipment_Maintain] AS [t0]
WHERE ([t0].[IsDeleted] = @p0) AND (([t0].[AuditStatus] = @p1) OR ([t0].[AuditStatus] = @p2))
原來是我如果在Select中取某表的數(shù)量并且條件中使用了之前from后的某個(gè)變量時(shí),這時(shí)用Count(條件)和Where(條件).Count()產(chǎn)生代碼才會(huì)不同,查詢速度才會(huì)出現(xiàn)數(shù)量級(jí)的差別。
代碼
//效率低版本:
from company in Company
select new
{
contacter = v.ContacterID,
count = Product_Maintain.Count(C => C.CompanyID == company.ID &&C.IsDeleted == 0 && (C.AuditStatus == 0 || C.AuditStatus == 4))
}
與
//效率高版本:
from company in Company
select new
{
contacter = v.ContacterID,
count = Product_Maintain.Where(C =>C.CompanyID == company.ID && C.IsDeleted == 0 && (C.AuditStatus == 0 || C.AuditStatus == 4)).Count()
}
否則,Count()與Where().Count()生成的SQL語句是相同的,效率也一樣。

相關(guān)文章
MSSQL數(shù)據(jù)庫占用內(nèi)存過大造成服務(wù)器死機(jī)問題的解決方法
有時(shí)候我們的服務(wù)器使用MSSQL數(shù)據(jù)庫,但如果MSSQL數(shù)據(jù)庫占用內(nèi)存過大可能導(dǎo)致服務(wù)器死機(jī),這里分享下解決方法, 需要的朋友可以參考下2013-07-07SQL Server 2016 CTP2.2安裝配置方法圖文教程
這篇文章主要為大家詳細(xì)介紹了SQL Server 2016 CTP2.2安裝配置方法圖文教程 ,感興趣的小伙伴們可以參考一下2016-07-07VS2015安裝之后加裝Sql server2014詳細(xì)步驟
這篇文章主要介紹了VS2015安裝之后加裝SQL SERVER2014詳細(xì)步驟,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-12-12SQLite3數(shù)據(jù)庫的介紹和使用教程(面向業(yè)務(wù)編程-數(shù)據(jù)庫)
這篇文章主要介紹了SQLite3數(shù)據(jù)庫的介紹和使用(面向業(yè)務(wù)編程-數(shù)據(jù)庫),本文從SQLite3的庫的獲取、工程管理、SQL語句介紹、C語言編程四個(gè)角度闡述了SQLite3數(shù)據(jù)庫的實(shí)際應(yīng)用,需要的朋友可以參考下2023-05-05sql server清理日志的實(shí)現(xiàn)步驟
清理 SQL Server 日志是數(shù)據(jù)庫管理的一項(xiàng)重要工作,可以釋放磁盤空間并提高數(shù)據(jù)庫性能,本文就來詳細(xì)的介紹一下,感興趣的可以了解一下2023-10-10盤點(diǎn)SqlServer?分頁方式和拉姆達(dá)表達(dá)式分頁
這篇文章主要介紹了SqlServer?5種分頁方式和拉姆達(dá)表達(dá)式分頁,進(jìn)來看看吧,本文結(jié)合示例代碼給大家講解的非常詳細(xì),需要的朋友可以參考下2022-12-12SQLSERVER加密解密函數(shù)(非對(duì)稱密鑰 證書加密 對(duì)稱密鑰)使用方法代碼
這篇文章主要介紹了SQLSERVER加密解密函數(shù)使用方法,使用了非對(duì)稱密鑰、證書加密、對(duì)稱密鑰、通行短語(PassPhrase)加密,大家參考使用吧2013-11-11SQL Server 2005附加數(shù)據(jù)庫時(shí)Read-Only錯(cuò)誤的解決方案
本文我們主要介紹了SQL Server 2005附加數(shù)據(jù)庫時(shí)提示Read-Only錯(cuò)誤的解決方案,需要的朋友可以參考下2015-08-08