sql语句执行效率低、速度很慢

语句如下:withrownumas(selectr=ROW_NUMBER()over(orderbya.fromuser,a.timestamp),*from(selec... 语句如下:

with rownum as
(
select r=ROW_NUMBER() over (order by a.fromuser,a.timestamp),*
from (select * from GL_G18_MsgSignalRecord where instype in (0,1) and fromtype=4 ) a
)
,totable as
(
select tot.region as colname, tot.robot as rowname,SUM(tot.onlinetime) as pvalue
from
(select Convert(varchar(4), datepart(YEAR,b.timestamp))+'-'+ REPLICATE('0',2-LEN(Convert(varchar(2), datepart(month,b.timestamp))))+ Convert(varchar(2), datepart(month,b.timestamp)) as month,
e.RegionName as region,
d.RobotCode as robot,
(case when c.instype=0 and b.instype=1 then DATEDIFF(S,c.timestamp,b.timestamp) else 0 end) as onlinetime
from rownum c,rownum b,DG_Robot d,DG_Region e where c.r=b.r-1 and b.fromuser=c.fromuser and b.fromuser=d.RobotCode and d.RegionCode=e.RegionCode
) tot group by region,robot
)
select top 5 colname from totable group by colname order by sum(pvalue) desc

其中主表 GL_G18_MsgSignalRecord中有12000左右的数据,执行速度为24s
主要实现功能:
取instype=0及下一条instype=1之间的时间间隔、按照月份(month)、区域(region)、机器人(robot)进行列选项搜索 ;
其中主表关联了区域、机器人两张表

求大神指点 如何优化此语句 谢谢
展开
 我来答
抄友灵70
2015-06-17 · TA获得超过183个赞
知道小有建树答主
回答量:441
采纳率:50%
帮助的人:183万
展开全部
算不上优化,按照自己的理解说
1能不用*就不要用*,把你要查询的字段写出来
2 e.RegionName不能在rownum中给检索出来么?感觉在上面检索会块一点点
3 为什么不直接查询你最后要的结果还要中间再查询个totable
4 totable的字查询里month是个无用字段

最后请大神点评以下
本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
鬼谷子教主
2015-06-17 · TA获得超过2496个赞
知道大有可为答主
回答量:1996
采纳率:88%
帮助的人:551万
展开全部
将一些无用的东西去掉:

1、with totable中的GROUP BY 这一层是多余的;
2、month字段计算没有地方引用,可以去掉;
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式