• 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对应的执行计划分析两者的区别

  • 相关阅读:
    8 财政收入预测分析
    NLP(2)--搭建简单的模型(nn)
    Mysql 面试题
    MFC 实现延时,并且进行消息分发,不阻塞
    【JavaEE初阶】 Thread类及常见方法
    MPPT太阳能充放电控制器数据采集-通过网关采集电池电压容量电量SOC,wifi传输
    mysql大表的更新和删除
    VUE3.0学习笔记
    docker安装zookeeper(单机版)
    程序员都不知道的代码
  • 原文地址:https://blog.csdn.net/weixin_44838902/article/details/136697746