当前位置: 首页 > article >正文

SQL在DBA手里-改写篇

背景

最近运营需要做月报汇总交易情况,之前一直是他们手工出的数据,他们想做成月初自动发送邮件,从而减轻他们的工作量。于是他们提供SQL我们在邮件服务器配置做定时发送任务。

表介绍(表及字段已做脱敏处理)

  • trans_profits
    交易毛利表:仅记录每天毛利数据
  • trans_offline_order
    线下订单表:记录线下订单情况
  • trans_online_order
    线上订单表:记录线上订单情况

SQL “变装”过程

原始:SQL
  • 缺点:不易读,查询套子查询
  • 查询解读:将线下及线上订单“交易笔数”“交易金额”数据合并再与毛利表按“交易日期”关联查询,显示:“交易笔数”,“交易金额”,“毛利金额”,“月份”
    –注:线上线下订单表为原始数据,毛利表为汇算后的数据,因此毛利表无需count(*)统计交易笔数;

 

select d.month       as 月,
       round(s.count/10000 , 2) ||'万'      as 交易笔数,
       round(s.amt/10000 , 2) ||'万'        as 交易金额,
       round(d.profits_amt/10000 , 2) ||'万' as 毛利金额
from (SELECT to_char(trans_time, 'yyyyMM') as month,
               sum(profits_amt) as profits_amt
          FROM trans_profits -- 交易毛利表
         where trans_time >=  to_date('20240101', 'yyyyMMdd')
         and   trans_time <   to_date('20241231', 'yyyyMMdd')
         group by to_char(trans_time, 'yyyyMM')) d
  left join (select month,
                    sum(count) as count,
                    sum(amt) as amt
               from (SELECT to_char(trans_time, 'yyyyMM') as month,
                            count(1) as count,
                            sum(trans_amt) as amt
                       FROM trans_offline_order  -- 线下订单表
                      where trans_cd = '00'
                        and trans_time >= to_TIMESTAMP('20240101', 'yyyyMMdd')
                        and trans_time <  to_TIMESTAMP('20241231', 'yyyyMMdd')
                      group by to_char(trans_time, 'yyyyMM')
                     union all
                     SELECT to_char(trans_time, 'yyyyMM') as month,
                            count(1) as count,
                            sum(trans_amt) AS amt
                       FROM trans_online_order  -- 线上订单表 
                      WHERE trans_type IN ('01', '02')
                        and trans_cd = '00'
                        and trans_time >= to_TIMESTAMP('20240101', 'yyyyMMdd')
                        and trans_time <  to_TIMESTAMP('20241231', 'yyyyMMdd')
                      group by to_char(trans_time, 'yyyyMM')) t
              group by month) s
    on d.month = s.month
 order by 1;

“变装”:SQL
  • 优点:查询简洁易懂
  • 查询解读:将线上、线下及毛利表进行数据合并,其中计算“交易笔数”线上、线下虚拟出列为ct 值为1标记,毛利表因为不需要记得笔数因此ct值标记为0,最后汇总时用sum(ct)列即可得到“交易笔数”。
SELECT 
substr(t.trans_time,0,6) 月,
       round(sum(ct) /10000 , 2) ||'万'         as 交易笔数,
       round(sum(trans_amt)/10000 , 2) ||'万'   as 交易金额,
       round(sum(profits_amt)/10000 , 2) ||'万' as 毛利金额
FROM (
SELECT to_char(trans_time,'yyyymmdd') trans_time,
        1 ct,
       trans_amt,
       0 profits_amt
FROM trans_offline_order  -- 线下订单表
where trans_cd = '00'
   and trans_time >= to_TIMESTAMP('20240101', 'yyyyMMdd')
   and trans_time <  to_TIMESTAMP('20241231', 'yyyyMMdd')
union all
SELECT to_char(trans_time,'yyyymmdd') trans_time,
         1 ct,
       trans_amt,
       0 profits_amt
FROM trans_online_order  -- 线上订单表 
WHERE trans_type IN ('01', '02')
   and trans_cd = '00'
   and trans_time >= to_TIMESTAMP('20240101', 'yyyyMMdd')
   and trans_time <  to_TIMESTAMP('20241231', 'yyyyMMdd')
union all 
SELECT to_char(trans_time,'yyyymmdd') trans_time,
       0 ct,
       0 trans_amt,
       profits_amt
FROM trans_profits  -- 交易毛利表
where trans_time  >= to_date('20240101', 'yyyyMMdd')
  and trans_time <   to_date('20241231', 'yyyyMMdd')
  ) t
  GROUP BY substr(t.trans_time,0,6)
  ORDER BY 1 ;

执行计划对比
  • Statistics 资源消耗 相同;
  • | Rows | Bytes | Cost (%CPU)| Time | 这几项明显“变装”后更优于原SQL写法,原SQL写法甚至还用到了TempSpc的耗;
  • 执行时间“变装”后慢了10+ms但影响不大;
    – 注(疑惑):明明从执行计划来分析“变装”后的SQL更优,为啥会变慢了呢?

    image.png

总结

SQL在其它部门的作用是以实现需求为主,但在DBA手里需要考虑在不改变需求结果的前提下,要让SQL更具有可读性及良好的性能。


http://www.kler.cn/a/523647.html

相关文章:

  • FireFox | Google Chrome | Microsoft Edge 禁用更新 final版
  • Android车机DIY开发之学习篇(七)NDK交叉工具构建
  • 计算机网络之计算机网络主要性能
  • Mac m1,m2,m3芯片使用nvm安装node14报错
  • 通过高效的侦察发现关键漏洞接管整个IT基础设施
  • Cross-Resolution知识蒸馏论文学习
  • 实验七 带函数查询和综合查询(2)
  • Deepseek-R1性能指标
  • 【Android】问deepseek存储访问
  • 当AI学会“顿悟”:DeepSeek-R1如何用强化学习突破推理边界?
  • TypeScript中的函数:类型安全与高级特性
  • Vue.js组件开发-实现下载动态进度条
  • 机器学习(7):集成学习
  • HTML中的元素(elements)
  • 特征衍生与XGB
  • RockyLinxu9远程登录问题
  • HashMap讲解
  • windows lm studio 0.3.8无法下载模型,更换镜像
  • 复古壁纸中棕色系和米色系哪个更受欢迎?
  • 09 以太坊技术介绍
  • 数据分析和AI丨应对AI实施挑战,工程领域AI应用的五大方法
  • 为AI聊天工具添加一个知识系统 之75 详细设计之16 正则表达式 之3 正则表达式模板
  • Highcharts 柱形图:深入解析与最佳实践
  • Openfga 授权模型搭建
  • StarRocks BE源码编译、CLion高亮跳转方法
  • http3网站的设置(AI不会配,得人工配)