【问题标题】:Redshift Join VS. Union with Group By红移加入VS。与 Group By 联合
【发布时间】:2017-05-17 20:48:14
【问题描述】:

假设我想从 2 个表中提取字段 dim,a,b,c,d,其中一个包含 a,b,另一个包含 c,d。

我想知道是否有首选方式(在以下方式之间) - 性能方面

1:

select t1.dim,a,b,c,d
from 
(select dim,sum(a) as a,sum(b)as b from t1 group by dim)t1 
join 
(select dim,sum(c) as c,sum(d) as d from t2 group by dim)t2 
on t1.dim=t2.dim;

2:

select dim,sum(a) as a,sum(b) as b,sum(c) as c,sum(d) as d
from 
(
select dim,a,b,null as c, null as d from t1
union
select dim,null as a, null as b, c, d from t2
)a
group by dim

当然在处理大量数据时(最终查询时为 5-30M 记录)。

谢谢!

【问题讨论】:

  • 检查两个查询的执行计划。
  • 谢谢@Viki888,但我问的是一般情况,这只是一个例子。
  • 正如 Gordon 在下面提到的那样,您肯定想要 union all 而不是 union,因为您不关心重复。在不测试特定案例的情况下,我会选择 Redshift 的 2 号。由于它是分布式列式存储,因此您必须将相同的数据移动到计算节点,但第二种情况没有连接的开销。求和是一种快速的内存操作。但是是的...查询执行计划。

标签: sql performance join union amazon-redshift


【解决方案1】:

第一种方法过滤不在两个表中的任何dim 值。 union 效率低下。所以,两者都没有吸引力。

我会去:

select dim, sum(a) as a, sum(b) as b, sum(c) as c, sum(d) as d
from (select dim, a, b, null as c, null as d from t1
      union all
      select dim, null as a, null as b, c, d from t2
     ) a
group by dim;

您还可以预先聚合每个子查询中的值。或者使用full outer join作为第一种方法。

【讨论】:

  • 感谢 Gordon,但我的主要问题是是否有一种明显首选的方式来明智地运行查询性能。假设连接不会删除任何行,并且两个查询的最终结果完全相同。在这种情况下,哪一个是 redshift 的最爱?
  • @evyamiz 。 . .您应该在数据上测试不同的方法。但是,使查询准确非常重要。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-11-22
  • 2019-01-27
  • 1970-01-01
  • 2015-05-25
  • 1970-01-01
  • 2012-09-04
  • 1970-01-01
相关资源
最近更新 更多