
部门同事来找我说现在用的几个存储过程(离职同事写的)查询太慢了, 要几个小时才能出结果, 于是我打开后看到了如此的内容...
我也不是说有什么优越感, 但是这槽点也太大了...
以下是部分片段, 该存储过程总计 900 行, 类似的计算部分大概有四百行多, 剩余部分全是字符串拼接
该同事还留下了另外几个存储过程等待修改, 看到五百行往上的满篇 left join, with 套 with
十几个表 left join, 还是 on a.col1 >= b.col2 and a.col2 < b.col2 这种连接
现在只想摸鱼
-- GMV SET @start_gmv = ( SELECT SUM(`客户付款总金额(¥)`) FROM `历史订单明细` WHERE `测算日期范围` = start_estimate_date AND `部门` LIKE CONCAT('%', @department, '%') AND `经营团队` LIKE CONCAT('%', @management_team, '%') AND `组别` LIKE CONCAT('%', @groups, '%') ); SET @end_gmv = ( SELECT SUM(`客户付款总金额(¥)`) FROM `历史订单明细` WHERE `测算日期范围` = end_estimate_date AND `部门` LIKE CONCAT('%', @department, '%') AND `经营团队` LIKE CONCAT('%', @management_team, '%') AND `组别` LIKE CONCAT('%', @groups, '%') ); -- 订单量 SET @start_order = ( SELECT COUNT(*) FROM `历史订单明细` WHERE `测算日期范围` = start_estimate_date AND `部门` LIKE CONCAT('%', @department, '%') AND `经营团队` LIKE CONCAT('%', @management_team, '%') AND `组别` LIKE CONCAT('%', @groups, '%') ); SET @end_order = ( SELECT COUNT(*) FROM `历史订单明细` WHERE `测算日期范围` = end_estimate_date AND `部门` LIKE CONCAT('%', @department, '%') AND `经营团队` LIKE CONCAT('%', @management_team, '%') AND `组别` LIKE CONCAT('%', @groups, '%') ); -- 产品销量 SET @start_sale = ( SELECT SUM(`产品销量`) FROM `历史订单明细` WHERE `测算日期范围` = start_estimate_date AND `部门` LIKE CONCAT('%', @department, '%') AND `经营团队` LIKE CONCAT('%', @management_team, '%') AND `组别` LIKE CONCAT('%', @groups, '%') ); SET @end_sale = ( SELECT SUM(`产品销量`) FROM `历史订单明细` WHERE `测算日期范围` = end_estimate_date AND `部门` LIKE CONCAT('%', @department, '%') AND `经营团队` LIKE CONCAT('%', @management_team, '%') AND `组别` LIKE CONCAT('%', @groups, '%') ); -- 客单价 SET @start_atv = ( SELECT SUM(`客户付款总金额(¥)`) / COUNT(*) FROM `历史订单明细` WHERE `测算日期范围` = start_estimate_date AND `部门` LIKE CONCAT('%', @department, '%') AND `经营团队` LIKE CONCAT('%', @management_team, '%') AND `组别` LIKE CONCAT('%', @groups, '%') ); SET @end_atv = ( SELECT SUM(`客户付款总金额(¥)`) / COUNT(*) FROM `历史订单明细` WHERE `测算日期范围` = end_estimate_date AND `部门` LIKE CONCAT('%', @department, '%') AND `经营团队` LIKE CONCAT('%', @management_team, '%') AND `组别` LIKE CONCAT('%', @groups, '%') ); -- 产品成本占比 ... 1 sxfscool 2020-10-15 15:17:20 +08:00 中文列表是不是槽点[捂脸] |
2 sxfscool 2020-10-15 15:17:40 +08:00 列名,打错了 |
3 weizhen199 2020-10-15 15:21:48 +08:00 我也不想看。。加索引加 hint 完事。 或者让他们改 java 做 |
4 什么数据库说下啊 |
5 raymanr OP @sxfscool 不是, 中文名其实我倒觉得还好, 比英文名还容易看懂意思点 WHERE 部分的 LIKE 运算符会进行全表扫描, 速度本来就很慢, 于是每查询一个变量就需要进行一次全表扫描, 可每次查询的都是同一张表同一个条件 |
6 raymanr OP @weizhen199 人都跑了, 现在这球提到我这来改了, 唉, 这么复杂的存储过程, 我花一两个个月来改不算过分吧 |
7 Mithril 2020-10-15 15:32:26 +08:00 @raymanr 可以的,不过你也别改了,马上 2077 就要 release 了。你要一个月的时间,花一礼拜重写了它,剩下的时间玩玩 2077 不香吗? |
8 xuanbg 2020-10-15 16:14:31 +08:00 唯一的槽点是 like,你可以改成= ‘xxid’,让程序先用可以模糊查询的下拉列表 like 查到并选中 id,再查询数据,这样就可以走索引了。 |
9 xuanbg 2020-10-15 16:18:16 +08:00 @xuanbg 譬如部门参数,就可以通过输入「业务」查询到业务 1 部、业务 2 部……,然后选中业务 1 部得到业务 1 部的 id,再用这个 id 来查询。 |
10 Rimifon 2020-10-15 16:19:33 +08:00 这个是不是应该先 select 到一个临时表,然后从临时表去做统计。like 语句改成 charindex 会不会好一些。 |
11 raymanr OP @< href="/member/xuanbg">xuanbg 算了, 本来就是非正规的业务, 数据部门的破事, 一个大表没主键没维度表, 主要也是这个 like 循环套循环的全表扫描一百多遍槽点太大了, 实际上查询需要用到的数据也就二三十万行, 跑了几个小时说出去真的是太丢人了 |
13 lasuar 2020-10-15 17:28:19 +08:00 为什么那么多人喜欢写存储过程 |
14 zouzou0208 2020-10-16 08:21:49 +08:00 建议重写。 |
15 no1xsyzy 2020-10-16 11:54:19 +08:00 |