一条SQL语句引发的血案

jincheng2008 2018-06-29 10:35:16
大家好,好长时间没有发帖了。各位牛人、大侠走过,路过不妨看看,如何优化SQL语句。

SQL片段:

SELECT
c.id hdid ,
b.bscwd,
b.sydw,
c.hdbh,
c.fysj,
c.cys,
GROUP_CONCAT(DISTINCT b.qsd) qsd,
GROUP_CONCAT(DISTINCT b.mdd) mdd,
c.cph,
c.qszt,
round(sum(w.wjtj),2) ztj,
round(sum(ifnull(s.zyywsr,0)),2) zyywsr,
round(sum(ifnull(e.srbk,0)),2) srbk,
round(sum(ifnull(f.yj,0)),2) zyj,
round(sum(ifnull(f.zyywcb,0)),2) zyywcb,
round(sum(ifnull(d.srkk,0)),2) cbkk ,
round(sum(ifnull(s.zyywsr,0))+sum(ifnull(e.srbk,0))-sum(ifnull(f.zyywcb,0))-sum(ifnull(d.srkk,0)),2) lr,
s.srjszt srsfjs,
f.cbjszt cbsfjs
FROM
zhuangche b
LEFT JOIN lirun a ON a.zcid = b.id
LEFT JOIN huidan c ON c.pcid = b.pcId
LEFT JOIN chengbenzhuijia d ON b.id = d.zcid
LEFT JOIN shouruzhuijia e ON b.id = e.zcid
LEFT JOIN chengbens f ON b.id = f.zcid
LEFT JOIN shouru s on b.id = s.zcid
LEFT JOIN (select sum(ifnull(sstj,sftj)) wjtj,zcid from wujian group by zcid) w on w.zcid = b.id
WHERE 1=1

语句说明:数据表关联太多,有的是需要需要取其他表的字段信息,有的是需要配合查询条件 ,一条SQL语句消耗10S,
更糟糕的是还要在页面进行统计相关财务信息,基本上有进行了一次统计:


select format(zyywsr,2) as zyywsr ,format(ifnull(srbk,0),2) as srbk,format(zyywcb,2) as zyywcb ,format(ifnull(cbkk,0),2) as cbkk,format((round(zyywsr,2) + round(ifnull(srbk,0),2)-round(zyywcb,2) -round(ifnull(cbkk,0),2)),2) as lr from (
SELECT sum(s.zyywsr) zyywsr,
sum(e.srbk) srbk,
sum(f.zyywcb) zyywcb,
sum(d.srkk) cbkk
FROM
zhuangche b
LEFT JOIN lirun a ON a.zcid = b.id
LEFT JOIN huidan c ON c.pcid = b.pcId
LEFT JOIN chengbenzhuijia d ON b.id = d.zcid
LEFT JOIN shouruzhuijia e ON b.id = e.zcid
LEFT JOIN chengbens f ON b.id = f.zcid
LEFT JOIN shouru s on b.id = s.zcid
where c.hdbh IS NOT NULL
) a


程序极慢,客户无法忍耐。
各位大侠,请支招。
我考虑用视图是不是可以解决?还是编写存储过程,感觉好像都不易处理。
...全文
335 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
sywcf 2018-07-03
  • 打赏
  • 举报
回复
第一:有视图,基本不会有啥提升.
第二:可以写个存储过程,把你需要的数据提取出来,存在一个表中.
建作业,定时执行存储过程,所有显示的数据,都从这个表中直接读取,这样速度就快了.
xiaoxiangqing 2018-07-02
  • 打赏
  • 举报
回复
这种情况,需要先查看执行计划,看慢在哪个地方。
shinger126 2018-07-02
  • 打赏
  • 举报
回复
语句最后有1=1,是还要拼接条件么?如果是还要拼接条件的话,那用存储过程来搞,用几个临时的中间表来限定条件
  • 打赏
  • 举报
回复
生产一下实际的执行计划,看一下那个操作的消耗%,哪个最大,就先优化哪个。

比如,有的是表扫描慢,就尽量建索引,如果是join的慢,那就尽量算其他的join 算法
jincheng2008 2018-06-29
  • 打赏
  • 举报
回复
我把统计查询的脚本放到视图里面,然后进行关联效率会提升吗?
jincheng2008 2018-06-29
  • 打赏
  • 举报
回复
sum是动态的,根据查询条件进行求和
丰云 2018-06-29
  • 打赏
  • 举报
回复
既然每次都全数据求和。。。。为毛不另外建一张表存这些总数。。。。
搞不懂这狗屁设计的在想撒。。。
丰云 2018-06-29
  • 打赏
  • 举报
回复
第二个语句的sum一样莫名其妙。。。。
丰云 2018-06-29
  • 打赏
  • 举报
回复
第一个语句里上面的sum莫名其妙。。。。。。
吉普赛的歌 2018-06-29
  • 打赏
  • 举报
回复
引用 7 楼 foren_whb 的回复:
用索引视图能提升效率

索引视图限制很多的, 那么多的表, 有一对多, 弄一个唯一聚集索引都不容易吧
此外, 楼主的一些函数不一定支持;
其次, 索引视图如果建立在增删改频繁的大表上,可能引起严重的堵塞和死锁, 这个需要使用前需要评估,仔细斟酌
丰云 2018-06-29
  • 打赏
  • 举报
回复
用索引视图能提升效率
吉普赛的歌 2018-06-29
  • 打赏
  • 举报
回复
引用 5 楼 jincheng2008 的回复:
我把统计查询的脚本放到视图里面,然后进行关联效率会提升吗?

不会有任何提升。

你这么多表, 基本上没有过滤, 还要统计, 如何快起来?
首先就应当过滤不需要的行和列。
比如:按时间去筛选,只取一周的数据。不需要的列去掉。并加上分页, 每页只取 20 行数据。
另外:
1. 连接字段有没有相应的索引?
2. 每个表有多少行?

22,207

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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