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更具有可读性及良好的性能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/960085.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

vue3入门基础学习之搭建登录验证功能

环境准备&#xff1a;node.js、Visual Studio Code&#xff08;也可以是其他开发工具&#xff0c;选自己熟悉的就行&#xff09; 下载地址&#xff1a;https://nodejs.p2hp.com/https://code.visualstudio.com/ 新建一个vue3的项目&#xff0c;选一个文件夹执行以下命令 使用…

Scrapy如何设置iP,并实现IP重用, IP代理池重用

前置知识 1/3乐观锁 2/3 Scrapy流程(非全部) 3/3 关于付费代理 我用的"快代理", 1000个ip, 每个ip1min的有效期, 你用的时候, 把你的链接, 用户名填上去就行 设置代理IP &#x1f512; & 帮助文档: ①meta ②meta#proxy$ 语法: ①proxy的设置: Request对象中…

消息队列篇--通信协议篇--网络通信模型(OSI7层参考模型,TCP/IP分层模型)

一、OSI参考模型&#xff08;Open Systems Interconnection Model&#xff09; OSI参考模型是一个用于描述和标准化网络通信功能的七层框架。它由国际标准化组织&#xff08;ISO&#xff09;提出&#xff0c;旨在为不同的网络设备和协议提供一个通用的语言和结构&#xff0c;以…

开源智慧园区管理系统对比五款主流产品探索智能运营新模式

内容概要 在这个数字化迅速发展的时代&#xff0c;园区管理也迎来了全新的机遇和挑战。众所周知&#xff0c;开源智慧园区管理系统作为一种创新解决方案&#xff0c;正逐步打破传统管理的局限性。它的开放性不仅使得系统可以根据具体需求进行灵活调整&#xff0c;也为用户提供…

leetcode——删除链表的倒数第N个节点(java)

给你一个链表&#xff0c;删除链表的倒数第 n 个结点&#xff0c;并且返回链表的头结点。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5], n 2 输出&#xff1a;[1,2,3,5] 示例 2&#xff1a; 输入&#xff1a;head [1], n 1 输出&#xff1a;[] 示例 3&#xf…

WPS数据分析000009

一、函数与数据透视表统计数据时效率差异 函数 F4绝对引用 数据透视表 二、数据透视表基础操作 数据透视表&#xff1a;一个快速的生成报表的工具 显示详细信息 方式一; 方式二&#xff1a; 移动数据透视表 删除数据透视表 复制粘贴数据透视表 留足空间&#xff0c;否则拖动字…

【C++图论】1761. 一个图中连通三元组的最小度数|2005

本文涉及知识点 C图论 LeetCode1761. 一个图中连通三元组的最小度数 给你一个无向图&#xff0c;整数 n 表示图中节点的数目&#xff0c;edges 数组表示图中的边&#xff0c;其中 edges[i] [ui, vi] &#xff0c;表示 ui 和 vi 之间有一条无向边。 一个 连通三元组 指的是 …

ubuntu 更新24LTS中断导致“系统出错且无法恢复,请联系系统管理员”

22LTS to 24LTS 更新过程中手jian把更新程序controlC导致的。 解决 目前企图完成更新来恢复&#xff0c;重启后有软件包冲突&#xff0c;sudo apt upgrade报冲突。无法进行。 将原来source.list重新 sudo dpkg --configure -a sudo apt install -f 这些都不管用。还是显示gno…

vscode环境中用仓颉语言开发时调出覆盖率的方法

在vscode中仓颉语言想得到在idea中利用junit和jacoco的覆盖率&#xff0c;需要如下几个步骤&#xff1a; 1.在vscode中搭建仓颉语言开发环境&#xff1b; 2.在源代码中右键运行[cangjie]coverage. 思路1&#xff1a;编写了测试代码的情况&#xff08;包管理工具&#xff09; …

C语言的灵魂——指针(1)

指针是C语言的灵魂&#xff0c;有了指针C语言才能完成一些复杂的程序&#xff1b;没了指针就相当于C语言最精髓的部分被去掉了&#xff0c;可见指针是多么重要。废话不多讲我们直接开始。 指针 一&#xff0c;内存和地址二&#xff0c;编址三&#xff0c;指针变量和地址1&#…

mantisbt添加修改用户密码

文章目录 问题当前版本安装流程创建用户修改密码老的方式探索阶段 问题 不太好改密码啊。貌似必须要域名要发邮件。公司太穷&#xff0c;看不见的东西不关心&#xff0c;只能改源码了。 当前版本 当前mantisbt版本 2.27 php版本 7.4.3 安装流程 &#xff08;下面流程不是…

DIY QMK量子键盘

最近放假了&#xff0c;趁这个空余在做一个分支项目&#xff0c;一款机械键盘&#xff0c;量子键盘取自固件名称QMK&#xff08;Quantum Mechanical Keyboard&#xff09;。 键盘作为计算机或其他电子设备的重要输入设备之一&#xff0c;通过将按键的物理动作转换为数字信号&am…

PostGIS笔记:PostgreSQL 数据库与用户 基础操作

数据库基础操作包括数据模型的实现、添加数据、查询数据、视图应用、创建日志规则等。我这里是在Ubuntu系统学习的数据库管理。Windows平台与Linux平台在命令上几乎无差异&#xff0c;只是说在 Windows 上虽然也能运行良好&#xff0c;但在性能、稳定性、功能扩展等方面&#x…

深度解析:基于Vue 3的教育管理系统架构设计与优化实践

一、项目架构分析 1. 技术栈全景 项目采用 Vue 3 TypeScript Tailwind CSS 技术组合&#xff0c;体现了现代前端开发的三大趋势&#xff1a; 响应式编程&#xff1a;通过Vue 3的Composition API实现细粒度响应 类型安全&#xff1a;约60%的组件采用TypeScript编写 原子化…

linux 管道符、重定向与环境变量

1. 输入输出重定向 在linux工作必须掌握的命令一文中&#xff0c;我们已经掌握了几乎所有基础常用的Linux命令&#xff0c;那么接下来的任务就是把多个命令适当的组合到一起&#xff0c;使其协同工作&#xff0c;会更高效的处理数据&#xff0c;做到这一点就必须搞清楚命令的输…

C语言编程笔记:文件处理的艺术

大家好&#xff0c;这里是小编的博客频道 小编的博客&#xff1a;就爱学编程 很高兴在CSDN这个大家庭与大家相识&#xff0c;希望能在这里与大家共同进步&#xff0c;共同收获更好的自己&#xff01;&#xff01;&#xff01; 本文目录 引言正文一、为什么要用文件二、文件的分…

K8s运维管理平台 - KubeSphere 3.x 和4.x 使用分析:功能较强,UI美观

目录标题 Lic使用感受优点&#xff1a;优化点&#xff1a; 实操首页项目 | 应用负载 | 配置 | 定制资源定义存储监控告警集群设置 **KubeSphere 3.x** 和 **4.x**1. **架构变化**&#xff1a;2. **多集群管理**&#xff1a;3. **增强的 DevOps 功能**&#xff1a;4. **监控与日…

堆的简要分析与实现(Java)

目录 开场白 顺序存储下标的关系 堆的定义 堆的实现 大顶堆 准备工作 建堆 获取最大元素 删除最大元素 删除指定索引元素 替换指定索引元素 新增元素 完整实现 & 单元测试 小顶堆 统一实现 总结 开场白 在上一篇文章中我们简要分析并实现了二叉树&#xff…

初学FreeRTOS --- 介绍

FreeRTOS介绍&#xff1a; “RTOS” 全称是 Real Time Operating System&#xff0c; 中文名就是实时操作系统&#xff0c;要注意的是&#xff0c; RTOS 并不是指某一特定的操作系统&#xff0c;而是指一类操作系统&#xff0c;例如&#xff0c; C/OS&#xff0c; FreeR…

【记录】日常|从零散记录到博客之星Top300的成长之路

文章目录 shandianchengzi 2024 年度盘点概述写作风格简介2024年的创作内容总结 shandianchengzi 2024 年度盘点 概述 2024年及2025年至今我创作了786即84篇文章&#xff0c;加上这篇就是85篇。 很荣幸这次居然能够入选博客之星Top300&#xff0c;这个排名在我之前的所有年份…