• Union和union导致的数据不一致


    平时工作中经常用到union,可以自带去重的操作,今天有个汇总的SQL也用了这个,需求是统计多张表的余额字段,看着就很简单union再sum或者sum再union。
    第一种每张表先汇总,使用 UNION ALL 合并后最外层再汇总
    SELECT SUM(total_sum) AS grand_total
    FROM (
    SELECT SUM(column_name) AS total_sum
    FROM table1
    UNION
    SELECT SUM(column_name) AS total_sum
    FROM table2
    UNION
    SELECT SUM(column_name) AS total_sum
    FROM table3
    ) subquery;

    第二种每张表不汇总,最外层统一汇总
    SELECT SUM(total_sum) AS grand_total
    FROM (
    SELECT column_name AS total_sum
    FROM table1
    UNION
    SELECT column_name AS total_sum
    FROM table2
    UNION
    SELECT column_name AS total_sum
    FROM table3
    ) subquery;

    但是两种结果并不一样,换个表两种方法的结果又一样了,且数据量大的情况下不一样,少的时候一样,当时还看了好久,怀疑是不是空值导致的,加上相同条件限制排查未发现问题,还是同事帮看到了union 不是union all 的原因。数据量少的情况下数据没有重复,金额四位小数重复,当数据量大的情况下会出现很多一模一样的金额,这时候区别就出来了。union 把一样的金额去重,只剩下部分数据,而union all完全保留结果会是全部的,就统计数据而言应该用union all。

    既然数据的问题解决了,还引发个新的疑惑,两者都用union的情况下,哪个效率会高一点,应该用哪个SQL,数据处理顺序有什么差异。这里记录一下个人看法。
    在比较方法一和方法二的效率时,一般来说,方法二更可能是更高效的选择。

    方法一的优点:

    • 减少数据传输量:在每张表内部进行 SUM 可以减少需要传输的数据量,因为只传输每张表的汇总值。
    • 减少最外层聚合计算:最外层只需要对少量的汇总结果进行 SUM,而不是对整个数据集进行聚合计算。

    方法一的缺点:

    • 多次聚合计算:需要在每张表内部进行 SUM,可能会导致多次聚合计算,特别是当数据量很大时,这可能会影响性能。

    方法二的优点:

    • 单一聚合计算:只需要在最外层对合并后的数据进行一次 SUM,减少了多次聚合计算的开销。
    • 简单:逻辑相对简单,不需要在每张表内部进行额外的聚合计算。

    方法二的缺点:

    • 传输整个数据集:需要传输所有数据到最外层进行汇总,可能会导致数据传输量较大。

    总体而言,方法二可能更高效,特别是在数据量较小或者需要简单逻辑的情况下。但是在涉及大数据量和需要减少数据传输量的情况下,方法一可能更有效。最佳选择取决于具体情况和需求。在实际应用中,可以根据数据量大小、性能要求等因素进行测试和选择最合适的方法。

    除此之外可查看SQL对应的执行计划分析两者的区别

  • 相关阅读:
    设计模式--装饰器模式
    GEE(11):为影像添加图例
    Python版【植物大战僵尸 +源码】
    基于SqlSugar的开发框架循序渐进介绍(12)-- 拆分页面模块内容为组件,实现分而治之的处理
    DAG 的深度优先搜索标记
    Es的核心概念
    java版工程管理系统Spring Cloud+Spring Boot+Mybatis实现工程管理系统源码
    WPF性能优化:性能分析工具
    springboot多用户B2C商城平台系统在线视频点播系统毕业设计毕设作品开题报告开题答辩PPT
    超越openmp通用核心的硬件
  • 原文地址:https://blog.csdn.net/weixin_44838902/article/details/136697746