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

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值