跳至主要內容
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?

4563博客

全新的繁體中文 WordPress 網站
  • 首頁
  • 一次查询优化…
未分類
23 10 月 2020

一次查询优化…

一次查询优化…

資深大佬 : raymanr 7

部门同事来找我说现在用的几个存储过程(离职同事写的)查询太慢了, 要几个小时才能出结果, 于是我打开后看到了如此的内容…

我也不是说有什么优越感, 但是这槽点也太大了…

以下是部分片段, 该存储过程总计 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, '%')     );  -- 产品成本占比 ... 

大佬有話說 (16)

  • 資深大佬 : sxfscool

    中文列表是不是槽点[捂脸]

  • 資深大佬 : sxfscool

    列名,打错了

  • 資深大佬 : weizhen199

    我也不想看。。加索引加 hint 完事。
    或者让他们改 java 做

  • 資深大佬 : ahmcsxcc

    什么数据库说下啊

  • 主 資深大佬 : raymanr

    @sxfscool
    不是, 中文名其实我倒觉得还好, 比英文名还容易看懂意思点

    WHERE 部分的 LIKE 运算符会进行全表扫描, 速度本来就很慢,

    于是每查询一个变量就需要进行一次全表扫描,

    可每次查询的都是同一张表同一个条件

  • 主 資深大佬 : raymanr

    @weizhen199
    人都跑了, 现在这球提到我这来改了, 唉, 这么复杂的存储过程, 我花一两个个月来改不算过分吧

  • 資深大佬 : Mithril

    @raymanr 可以的,不过你也别改了,马上 2077 就要 release 了。你要一个月的时间,花一礼拜重写了它,剩下的时间玩玩 2077 不香吗?

  • 資深大佬 : xuanbg

    唯一的槽点是 like,你可以改成= ‘xxid’,让程序先用可以模糊查询的下拉列表 like 查到并选中 id,再查询数据,这样就可以走索引了。

  • 資深大佬 : xuanbg

    @xuanbg 譬如部门参数,就可以通过输入「业务」查询到业务 1 部、业务 2 部……,然后选中业务 1 部得到业务 1 部的 id,再用这个 id 来查询。

  • 資深大佬 : Rimifon

    这个是不是应该先 select 到一个临时表,然后从临时表去做统计。like 语句改成 charindex 会不会好一些。

  • 主 資深大佬 : raymanr

    @xuanbg
    算了, 本来就是非正规的业务, 数据部门的破事, 一个大表没主键没维度表, 主要也是这个 like 循环套循环的全表扫描一百多遍槽点太大了, 实际上查询需要用到的数据也就二三十万行, 跑了几个小时说出去真的是太丢人了

  • 資深大佬 : zoharSoul

    @sxfscool 专有领域中文列名挺好的.
    很多东西不好翻译.

  • 資深大佬 : lasuar

    为什么那么多人喜欢写存储过程

  • 資深大佬 : zouzou0208

    建议重写。

  • 資深大佬 : no1xsyzy

    @zoharSoul 然而不是中文专有领域,这些中文单词都是英文强行翻译过来的,找到原本的英文术语就行
    @xuanbg 但是我挺喜欢我用的系统就这么 concat 两个 % 上去当作模糊搜索的,有必要的话我自己也可以手写几个 % 进去更模糊地搜索(

  • 主 資深大佬 : raymanr

    @lasuar
    我恨存储过程, 改这个破东西时候心里已经骂了提出用存储过程来解决和写这个垃圾存储过程的人五千万遍了

    尤其是今天快改完时候发现最后几行的一个没见过的函数, 打开该函数发现又是一千行的时候

文章導覽

上一篇文章
下一篇文章

AD

其他操作

  • 登入
  • 訂閱網站內容的資訊提供
  • 訂閱留言的資訊提供
  • WordPress.org 台灣繁體中文

51la

4563博客

全新的繁體中文 WordPress 網站
返回頂端
本站採用 WordPress 建置 | 佈景主題採用 GretaThemes 所設計的 Memory
4563博客
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?
在這裡新增小工具