Cont()与Where().Count()有时性能差别如此之大!_MsSql

想起我之前在此列表中加入了一个字段,用于方便提示管理员公司的产品列表是否有修改之类的状态字段,于是可以断定是加了此字段的原因。

首先,先看看我之前是如何写这个提示状态字段的,实体中加入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秒,哇塞!

 

图2为Where(条件).Count()结果,同样的数据只用了4秒钟,差了10倍!

 

然后为了取值方面我还是加入三元运算,ContentStatus=Product_Maintain.Where(C => C.CompanyID == company.ID && C.IsDeleted == 0 && (C.AuditStatus == 0 || C.AuditStatus == 4)).Count()>0?"产品有更新":""。结果如下:

 

真的是Count()与 Where()区别,不可能这么大差距吧?于是我单写

 Product_Maintain.Where(C => C.IsDeleted == 0 && (C.AuditStatus == 0 || C.AuditStatus == 4)).Count()  与

 Product_Maintain.Count(C => C.IsDeleted == 0 && (C.AuditStatus == 0 || C.AuditStatus == 4))   

发现速度差不多,生成的代码是一样的。

复制代码 代码如下:

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

原来是我如果在Select中取某表的数量并且条件中使用了之前from后的某个变量时,这时用Count(条件)和Where(条件).Count()产生代码才会不同,查询速度才会出现数量级的差别。
代码

复制代码 代码如下:

//效率低版本:
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语句是相同的,效率也一样。

      总结到此,望各位看官以后要注意!本人入园两年来,第一发在首页,请各位看官不吝赐教!

      

      谢谢各位看官的指点,声明下以上查询图都LinqPad查询结果截图。至于为啥4秒左右为LinqPad查询时间,Linq生成Sql语句在Sql Server中执行不到1秒,以下截图作解释:

   

时间: 2024-09-15 09:42:03

Cont()与Where().Count()有时性能差别如此之大!_MsSql的相关文章

Cont()与Where().Count()有时性能差别如此之大!

想起我之前在此列表中加入了一个字段,用于方便提示管理员公司的产品列表是否有修改之类的状态字段,于是可以断定是加了此字段的原因. 首先,先看看我之前是如何写这个提示状态字段的,实体中加入ContentStatus,然后直接在Linq语句中Select 实体对象中加入ContentStatus=Product_Maintain.Count(C => C.CompanyID == company.ID && C.IsDeleted == 0 && (C.AuditStatu

Cont()与Where().Count()有时性能差别如此之大

今天在修改后台用户公司管理列表时,发现列表加载超慢的bug!好几十秒啊!数据是相对其他的列表 是稍微多点,不过也就4000多条,之前是好的,为啥这么慢呢?想起我之前在此列表中加入了一个字段, 用于方便提示管理员公司的产品列表是否有修改之类的状态字段,于是可以断定是加了此字段的原因. 首先,先看看我之前是如何写这个提示状态字段的,实体中加入ContentStatus,然后直接在Linq语句 中Select 实体对象中加入ContentStatus=Product_Maintain.Count(C

关于Expression Tree和IL Emit的所谓的"性能差别"

昨天写了<三种属性操作性能比较>,有个网友写信问我一个问题:从性能上看,Expression Tree和IL Emit孰优孰劣?虽然我在回信中作了简单的回答,但不知道这个网友是否懂我的意思.反正今天呆在家里也没事儿,干脆再就这个话题再写一篇文章. 目录: 一.Expression Tree和IL Emit并不存在所谓的性能差异 二.属性赋值操作的两种写法 三.属性取值操作的两种写法 四.两种写法对应的IL   一.Expression Tree和IL Emit并不存在所谓的性能差异 Expre

sql-谁能解答下为什么这两个SQL,只是关联顺序不一样,性能差别那么大

问题描述 谁能解答下为什么这两个SQL,只是关联顺序不一样,性能差别那么大 第一个 : SELECT a.request_detail_id, a.vendorid, a.request_id, a.s1, a.s2, a.s3, a.s4, a.profit, a.ratio, a.requestqty, a.stockqty, a.sponroadqty, a.reqonroadqty, a.reqpurqty, a.piqty, a.ispurchase, a.remark, a.skui

java-Java用对象作为参数和用简单类型作为参数的效率差别有多大

问题描述 Java用对象作为参数和用简单类型作为参数的效率差别有多大 用简单类型作为参数就是把参数个数和类型写死,改动影响大,如果使用对象传参,就很灵活,但传递对象的效率会差一点,这两种方式该如何取舍? 解决方案 你自己都说了,后者灵活一些,难道你自己还不能取舍性能和灵活性么? 解决方案二: 既然用JAVA了,这点开销还计算在内?

DDR3与DDR4性能差距有多大

DDR3与DDR4性能差距有多大   内存测试是比较无聊的,目前在各大硬件中,内存的频率往往也是最容易被忽略的,反倒是内存的容量,要比内存的频率受关注度要更高一些.当然内存容量多大为最佳,是16G还是8G,亦或是4G,还是看用户的使用习惯了,现在有人还在拿1G,2G内存在用,也不是什么稀奇事.言归正传,先展示一下测试使用的二款内存,一款是芝奇的DDR3内存,型号为芝奇TridentX 8GB DDR3 2400(F3-2400C10D-8GTX),另一款是宇瞻的DDR4内存,型号为宇瞻突击队Co

六代i5/i7性能差距有多大?i5-6600K与i7-6700K超频

超频对于热爱DIY的玩家们来说,想必都不陌生.但由于新一代Skylake芯片组的不锁倍频和外频的双重设定,让其超频的极限更加难以捉摸.目前支持超频的第六代酷睿产品仅有i5-6600K和i7-6700K,因此本次我们就以这两款处理器为切入点,尝试挑战这两款产品的超频极限,同时对比一下i5和i7分别具备怎样的超频潜力,看看六代i5/i7性能差距到底有多大. 性能差距有多大?i5-6600K与i7 6700K超频对比实测 在测试开始之前,我们有必要先来了解一下此次参与超频对比测试的两款处理器的基本参数

揭秘IDC商家:机房价格差别怎么那么大

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 为什么访问我的网站时快时慢?为什么同样的带宽,不同的机房价格差别那么大?归根结底一句话带宽质量不同.带着网友的几个问题,小编走访了几家数据中心,询问了不少技术人员,学习了一些知识,分享给大家.希望大家共同交流,QQ:719323216. 首先学习一下理论知识,带宽质量由接入方式和带宽大小共同决定. 带宽大小:也就是我们常说的100M.10M.

一起谈.NET技术,关于Expression Tree和IL Emit的所谓的&amp;quot;性能差别&amp;quot;

昨天写了<三种属性操作性能比较>,有个网友写信问我一个问题:从性能上看,Expression Tree和IL Emit孰优孰劣?虽然我在回信中作了简单的回答,但不知道这个网友是否懂我的意思.反正今天呆在家里也没事儿,干脆再就这个话题再写一篇文章. 目录: 一.Expression Tree和IL Emit并不存在所谓的性能差异 二.属性赋值操作的两种写法 三.属性取值操作的两种写法 四.两种写法对应的IL 一.Expression Tree和IL Emit并不存在所谓的性能差异 Express