加了having变慢

xiongxyt2 2016-06-28 12:21:14
select CustomedSer.CustomedSerID,CustomedSer.userid,min(CustomedSercreatetime) as 'CustomedSercreatetime',
min(username) as 'username',min(CustomedSerstatus) as 'CustomedSerstatus',
GraphicsModel=stuff((select ','+GraphicsModel from GraphicsInfo where CustomedSer.CustomedSerID=GraphicsInfo.CustomedSerID for xml path('')),1,1,''),
min(CustomedSerupdatetime) as 'CustomedSerupdatetime',min(username) as 'username',sum(num) as TotalNum
from CustomedSer left join userinfo as u on CustomedSer.userid=u.userid
left join GraphicsInfo on CustomedSer.CustomedSerID=GraphicsInfo.CustomedSerID
group by CustomedSer.CustomedSerID, CustomedSer.userid,u.userapprovalid,u.usertype
order by CustomedSerstatus

这个代码段这行很快,为啥加了having之后就变慢了蛮多


select CustomedSer.CustomedSerID,CustomedSer.userid,min(CustomedSercreatetime) as 'CustomedSercreatetime',
min(username) as 'username',min(CustomedSerstatus) as 'CustomedSerstatus',
GraphicsModel=stuff((select ','+GraphicsModel from GraphicsInfo where CustomedSer.CustomedSerID=GraphicsInfo.CustomedSerID for xml path('')),1,1,''),
min(CustomedSerupdatetime) as 'CustomedSerupdatetime',min(username) as 'username',sum(num) as TotalNum
from CustomedSer left join userinfo as u on CustomedSer.userid=u.userid
left join GraphicsInfo on CustomedSer.CustomedSerID=GraphicsInfo.CustomedSerID
group by CustomedSer.CustomedSerID, CustomedSer.userid,u.userapprovalid,u.usertype
having u.userapprovalid=72 and u.usertype='Service'
order by CustomedSerstatus
变慢了,才几千条数据,结果集也就一千多条耗时15秒
...全文
579 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiongxyt2 2016-06-30
  • 打赏
  • 举报
回复
引用 18 楼 roy_88 的回复:
注释GraphicsModel栏位快是一定的,主要看GraphicsInfo 表大小数量 有没过索 create index IX_GraphicsInfo_xx on GraphicsInfo (CustomedSerID)include(GraphicsModel ) 以上语句都参照以上方法创建索引 select放在include,where放在前一个括号里 看一下联索机索引的创建语法和作用
非常感谢 成功提速了 有MSSQL优化推荐的书么(带实战实例的最好)
中国风 2016-06-30
  • 打赏
  • 举报
回复
注释GraphicsModel栏位快是一定的,主要看GraphicsInfo 表大小数量 有没过索 create index IX_GraphicsInfo_xx on GraphicsInfo (CustomedSerID)include(GraphicsModel ) 以上语句都参照以上方法创建索引 select放在include,where放在前一个括号里 看一下联索机索引的创建语法和作用
中国风 2016-06-30
  • 打赏
  • 举报
回复
你要学会看执行计划,不然谈什么优化之类都是空谈,你学不到东西 WHERE条件会优先于HAVING执行比如:WHERE 放条件慢,那就要看是不是没有用到索引或索引不当 没有你的环境,测不了只能自己动手
xiaoxiangqing 2016-06-30
  • 打赏
  • 举报
回复
看下执行计划是哪里慢了
  • 打赏
  • 举报
回复
不要速度慢就建索引, 脑子有毛病?
xiongxyt2 2016-06-29
  • 打赏
  • 举报
回复
select CustomedSer.CustomedSerID,CustomedSer.userid,min(CustomedSercreatetime) as 'CustomedSercreatetime',
min(username) as 'username',min(CustomedSerstatus) as 'CustomedSerstatus',
--GraphicsModel=stuff((select ','+GraphicsModel from GraphicsInfo where CustomedSer.CustomedSerID=GraphicsInfo.CustomedSerID for xml path('')),1,1,''),
min(CustomedSerupdatetime) as 'CustomedSerupdatetime',min(username) as 'username'
from (select * from userinfo as u1 where  u1.userapprovalid=72 and u1.usertype='Service' and userid in (select userid from CustomedSer)) as u 
left join CustomedSer   on CustomedSer.userid=u.userid 
left join GraphicsInfo  on CustomedSer.CustomedSerID=GraphicsInfo.CustomedSerID 
group by CustomedSer.CustomedSerID, CustomedSer.userid,u.userapprovalid,u.usertype 
having u.userapprovalid=72 and u.usertype='Service' 
order by CustomedSerstatus
这样0s了
xiongxyt2 2016-06-29
  • 打赏
  • 举报
回复
引用 13 楼 roy_88 的回复:
把条件列,建上索引 没影响应该是没建索引或索引不当没有用到
CREATE INDEX userinfo_userapprovalid_index ON userinfo (userapprovalid,usertype)
select CustomedSer.CustomedSerID,CustomedSer.userid,min(CustomedSercreatetime) as 'CustomedSercreatetime',
min(username) as 'username',min(CustomedSerstatus) as 'CustomedSerstatus',
GraphicsModel=stuff((select ','+GraphicsModel from GraphicsInfo where CustomedSer.CustomedSerID=GraphicsInfo.CustomedSerID for xml path('')),1,1,''),
min(CustomedSerupdatetime) as 'CustomedSerupdatetime',min(username) as 'username'
from userinfo as u left join CustomedSer  on CustomedSer.userid=u.userid 
left join GraphicsInfo on CustomedSer.CustomedSerID=GraphicsInfo.CustomedSerID 
group by CustomedSer.CustomedSerID, CustomedSer.userid,u.userapprovalid,u.usertype 
having u.userapprovalid=72 and u.usertype='Service' 
order by CustomedSerstatus
7s SELECT CustomedSer.CustomedSerID , CustomedSer.userid , MIN(CustomedSercreatetime) AS 'CustomedSercreatetime' , MIN(username) AS 'username' , MIN(CustomedSerstatus) AS 'CustomedSerstatus' , GraphicsModel = STUFF(( SELECT ',' + GraphicsModel FROM GraphicsInfo WHERE CustomedSer.CustomedSerID = GraphicsInfo.CustomedSerID FOR XML PATH('') ), 1, 1, '') , MIN(CustomedSerupdatetime) AS 'CustomedSerupdatetime' , MIN(username) AS 'username' , SUM(num) AS TotalNum FROM CustomedSer LEFT JOIN userinfo AS u ON CustomedSer.userid = u.userid LEFT JOIN GraphicsInfo ON CustomedSer.CustomedSerID = GraphicsInfo.CustomedSerID WHERE u.userapprovalid = 72 AND u.usertype = 'Service' GROUP BY CustomedSer.CustomedSerID , CustomedSer.userid , u.userapprovalid , u.usertype 这个15s
中国风 2016-06-29
  • 打赏
  • 举报
回复
把条件列,建上索引 没影响应该是没建索引或索引不当没有用到
xiongxyt2 2016-06-29
  • 打赏
  • 举报
回复
引用 10 楼 roy_88 的回复:
用法不恰当, 用where ,条件过滤再分组 用 having,分组再过滤条件 用以下方式试试 SELECT CustomedSer.CustomedSerID , CustomedSer.userid , MIN(CustomedSercreatetime) AS 'CustomedSercreatetime' , MIN(username) AS 'username' , MIN(CustomedSerstatus) AS 'CustomedSerstatus' , GraphicsModel = STUFF(( SELECT ',' + GraphicsModel FROM GraphicsInfo WHERE CustomedSer.CustomedSerID = GraphicsInfo.CustomedSerID FOR XML PATH('') ), 1, 1, '') , MIN(CustomedSerupdatetime) AS 'CustomedSerupdatetime' , MIN(username) AS 'username' , SUM(num) AS TotalNum FROM CustomedSer LEFT JOIN userinfo AS u ON CustomedSer.userid = u.userid LEFT JOIN GraphicsInfo ON CustomedSer.CustomedSerID = GraphicsInfo.CustomedSerID WHERE u.userapprovalid = 72 AND u.usertype = 'Service' GROUP BY CustomedSer.CustomedSerID , CustomedSer.userid , u.userapprovalid , u.usertype
谢谢回复 用你这个还是15s 大家的思路是先筛选 我已经尝试: select CustomedSer.CustomedSerID,CustomedSer.userid,min(CustomedSercreatetime) as 'CustomedSercreatetime', min(username) as 'username',min(CustomedSerstatus) as 'CustomedSerstatus', GraphicsModel=stuff((select ','+GraphicsModel from GraphicsInfo where CustomedSer.CustomedSerID=GraphicsInfo.CustomedSerID for xml path('')),1,1,''), min(CustomedSerupdatetime) as 'CustomedSerupdatetime',min(username) as 'username',sum(num) as TotalNum from (select * from CustomedSer where userid in (select userid from userinfo as u1 where u1.userapprovalid=72 and u1.usertype='Service')) as CustomedSer left join userinfo as u on CustomedSer.userid=u.userid left join GraphicsInfo on CustomedSer.CustomedSerID=GraphicsInfo.CustomedSerID group by CustomedSer.CustomedSerID,CustomedSer.userid 照样是15s
kingtiy 2016-06-28
  • 打赏
  • 举报
回复
数据过滤用where条件.可以减少数据的计算量. 你在having里操作,相关是前面全表操作完后再来过滤. 性能明显会受影响.
中国风 2016-06-28
  • 打赏
  • 举报
回复
用法不恰当, 用where ,条件过滤再分组 用 having,分组再过滤条件 用以下方式试试 SELECT CustomedSer.CustomedSerID , CustomedSer.userid , MIN(CustomedSercreatetime) AS 'CustomedSercreatetime' , MIN(username) AS 'username' , MIN(CustomedSerstatus) AS 'CustomedSerstatus' , GraphicsModel = STUFF(( SELECT ',' + GraphicsModel FROM GraphicsInfo WHERE CustomedSer.CustomedSerID = GraphicsInfo.CustomedSerID FOR XML PATH('') ), 1, 1, '') , MIN(CustomedSerupdatetime) AS 'CustomedSerupdatetime' , MIN(username) AS 'username' , SUM(num) AS TotalNum FROM CustomedSer LEFT JOIN userinfo AS u ON CustomedSer.userid = u.userid LEFT JOIN GraphicsInfo ON CustomedSer.CustomedSerID = GraphicsInfo.CustomedSerID WHERE u.userapprovalid = 72 AND u.usertype = 'Service' GROUP BY CustomedSer.CustomedSerID , CustomedSer.userid , u.userapprovalid , u.usertype
足球不是方的 2016-06-28
  • 打赏
  • 举报
回复
select CustomedSer.CustomedSerID,CustomedSer.userid,min(CustomedSercreatetime) as 'CustomedSercreatetime', min(username) as 'username',min(CustomedSerstatus) as 'CustomedSerstatus', GraphicsModel=stuff((select ','+GraphicsModel from GraphicsInfo where CustomedSer.CustomedSerID=GraphicsInfo.CustomedSerID for xml path('')),1,1,''), min(CustomedSerupdatetime) as 'CustomedSerupdatetime',min(username) as 'username',sum(num) as TotalNum from CustomedSer inner join userinfo as u on CustomedSer.userid=u.userid left join GraphicsInfo on CustomedSer.CustomedSerID=GraphicsInfo.CustomedSerID where u.userapprovalid=72 and u.usertype='Service' group by CustomedSer.CustomedSerID, CustomedSer.userid,u.userapprovalid,u.usertype order by CustomedSerstatus
xiongxyt2 2016-06-28
  • 打赏
  • 举报
回复
引用 7 楼 shoppo0505 的回复:
你既然知道那些数据不需要的,那表连结之前就去除,这是我要表达的观点. 具体怎么做,你自己看
恩 你的思路我知道
select CustomedSer.CustomedSerID,CustomedSer.userid,min(CustomedSercreatetime) as 'CustomedSercreatetime',
min(username) as 'username',min(CustomedSerstatus) as 'CustomedSerstatus',
GraphicsModel=stuff((select ','+GraphicsModel from GraphicsInfo where CustomedSer.CustomedSerID=GraphicsInfo.CustomedSerID for xml path('')),1,1,''),
min(CustomedSerupdatetime) as 'CustomedSerupdatetime',min(username) as 'username',sum(num) as TotalNum 
from (select * from CustomedSer where userid in (select userid from userinfo as u1 where u1.userapprovalid=72 and u1.usertype='Service')) as CustomedSer
left join userinfo as u on CustomedSer.userid=u.userid 
left join GraphicsInfo on CustomedSer.CustomedSerID=GraphicsInfo.CustomedSerID 
group by CustomedSer.CustomedSerID,CustomedSer.userid
执行照样需要15s 没弄过数据优化 不知道有什么工具测试问题在哪里
shoppo0505 2016-06-28
  • 打赏
  • 举报
回复
你既然知道那些数据不需要的,那表连结之前就去除,这是我要表达的观点. 具体怎么做,你自己看
shoppo0505 2016-06-28
  • 打赏
  • 举报
回复
你既然知道那些数据不需要的,那表连结之前就去除,这是我要表达的观点. 具体怎么做,你自己看
zbdzjx 2016-06-28
  • 打赏
  • 举报
回复
没仔细看,随便说说:having改成where,放到group前面试试看。
xiongxyt2 2016-06-28
  • 打赏
  • 举报
回复
引用 3 楼 shoppo0505 的回复:
[quote=引用 2 楼 xiongxyt2 的回复:] [quote=引用 1 楼 shoppo0505 的回复:] 试试这个方式 select CustomedSer.CustomedSerID,CustomedSer.userid,min(CustomedSercreatetime) as 'CustomedSercreatetime', min(username) as 'username',min(CustomedSerstatus) as 'CustomedSerstatus', GraphicsModel=stuff((select ','+GraphicsModel from GraphicsInfo where CustomedSer.CustomedSerID=GraphicsInfo.CustomedSerID for xml path('')),1,1,''), min(CustomedSerupdatetime) as 'CustomedSerupdatetime',min(username) as 'username',sum(num) as TotalNum from CustomedSer left join userinfo as u on CustomedSer.userid=u.userid and u.userapprovalid=72 and u.usertype='Service' left join GraphicsInfo on CustomedSer.CustomedSerID=GraphicsInfo.CustomedSerID group by CustomedSer.CustomedSerID, CustomedSer.userid,u.userapprovalid,u.usertype
你这个结果集是不对的,会把所有的数据显示出来,包括u.userapprovalid不等于72的数据[/quote] 你试过了?[/quote]
引用 3 楼 shoppo0505 的回复:
[quote=引用 2 楼 xiongxyt2 的回复:] [quote=引用 1 楼 shoppo0505 的回复:] 试试这个方式 select CustomedSer.CustomedSerID,CustomedSer.userid,min(CustomedSercreatetime) as 'CustomedSercreatetime', min(username) as 'username',min(CustomedSerstatus) as 'CustomedSerstatus', GraphicsModel=stuff((select ','+GraphicsModel from GraphicsInfo where CustomedSer.CustomedSerID=GraphicsInfo.CustomedSerID for xml path('')),1,1,''), min(CustomedSerupdatetime) as 'CustomedSerupdatetime',min(username) as 'username',sum(num) as TotalNum from CustomedSer left join userinfo as u on CustomedSer.userid=u.userid and u.userapprovalid=72 and u.usertype='Service' left join GraphicsInfo on CustomedSer.CustomedSerID=GraphicsInfo.CustomedSerID group by CustomedSer.CustomedSerID, CustomedSer.userid,u.userapprovalid,u.usertype
你这个结果集是不对的,会把所有的数据显示出来,包括u.userapprovalid不等于72的数据[/quote] 你试过了?[/quote] 试过了 左连一左边的为主,你只是在第二个表筛选当然没有筛选掉u.userapprovalid不等于72的CustomedSer 中数据了
shoppo0505 2016-06-28
  • 打赏
  • 举报
回复
引用 2 楼 xiongxyt2 的回复:
[quote=引用 1 楼 shoppo0505 的回复:] 试试这个方式 select CustomedSer.CustomedSerID,CustomedSer.userid,min(CustomedSercreatetime) as 'CustomedSercreatetime', min(username) as 'username',min(CustomedSerstatus) as 'CustomedSerstatus', GraphicsModel=stuff((select ','+GraphicsModel from GraphicsInfo where CustomedSer.CustomedSerID=GraphicsInfo.CustomedSerID for xml path('')),1,1,''), min(CustomedSerupdatetime) as 'CustomedSerupdatetime',min(username) as 'username',sum(num) as TotalNum from CustomedSer left join userinfo as u on CustomedSer.userid=u.userid and u.userapprovalid=72 and u.usertype='Service' left join GraphicsInfo on CustomedSer.CustomedSerID=GraphicsInfo.CustomedSerID group by CustomedSer.CustomedSerID, CustomedSer.userid,u.userapprovalid,u.usertype
你这个结果集是不对的,会把所有的数据显示出来,包括u.userapprovalid不等于72的数据[/quote] 你试过了?
xiongxyt2 2016-06-28
  • 打赏
  • 举报
回复
引用 1 楼 shoppo0505 的回复:
试试这个方式 select CustomedSer.CustomedSerID,CustomedSer.userid,min(CustomedSercreatetime) as 'CustomedSercreatetime', min(username) as 'username',min(CustomedSerstatus) as 'CustomedSerstatus', GraphicsModel=stuff((select ','+GraphicsModel from GraphicsInfo where CustomedSer.CustomedSerID=GraphicsInfo.CustomedSerID for xml path('')),1,1,''), min(CustomedSerupdatetime) as 'CustomedSerupdatetime',min(username) as 'username',sum(num) as TotalNum from CustomedSer left join userinfo as u on CustomedSer.userid=u.userid and u.userapprovalid=72 and u.usertype='Service' left join GraphicsInfo on CustomedSer.CustomedSerID=GraphicsInfo.CustomedSerID group by CustomedSer.CustomedSerID, CustomedSer.userid,u.userapprovalid,u.usertype
你这个结果集是不对的,会把所有的数据显示出来,包括u.userapprovalid不等于72的数据
shoppo0505 2016-06-28
  • 打赏
  • 举报
回复
试试这个方式 select CustomedSer.CustomedSerID,CustomedSer.userid,min(CustomedSercreatetime) as 'CustomedSercreatetime', min(username) as 'username',min(CustomedSerstatus) as 'CustomedSerstatus', GraphicsModel=stuff((select ','+GraphicsModel from GraphicsInfo where CustomedSer.CustomedSerID=GraphicsInfo.CustomedSerID for xml path('')),1,1,''), min(CustomedSerupdatetime) as 'CustomedSerupdatetime',min(username) as 'username',sum(num) as TotalNum from CustomedSer left join userinfo as u on CustomedSer.userid=u.userid and u.userapprovalid=72 and u.usertype='Service' left join GraphicsInfo on CustomedSer.CustomedSerID=GraphicsInfo.CustomedSerID group by CustomedSer.CustomedSerID, CustomedSer.userid,u.userapprovalid,u.usertype

34,594

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧