Redshift 中的 GROUP BY 后不必要的 DS_BCAST_INNER
Posted
技术标签:
【中文标题】Redshift 中的 GROUP BY 后不必要的 DS_BCAST_INNER【英文标题】:Unnecessary DS_BCAST_INNER after GROUP BY in Redshift 【发布时间】:2015-06-27 08:15:11 【问题描述】:我有一个问题,想知道是否有解决办法。
我的查询中有绝对不必要的表广播(DS_BCAST_INNER)。
假设您有 Table1 和 Table2 都具有相同的 distkey MediaId。
当我直接加入两个表时,没有重新分配是好的。但是当我尝试做类似的事情时:
WITH t1
AS
(
SELECT MediaId, ... FROM Table1 ...predicates... GROUP BY MediaId, ...
),
t2 AS
(
SELECT MediaId, ... FROM Table2 ...predicates... GROUP BY MediaId, ...
)
Select ... FROM t1 JOIN t2 ON t.MediaId = t2.MediaId ....
我在解释命令显示的执行计划中看到DS_BCAST_INNER,但它显然没用。
如何避免?
【问题讨论】:
我也有同样的问题。你搞清楚了吗? 【参考方案1】:对此运行EXPLAIN
并查看表的基础数据类型(在分组依据之前)。
我最近看到 Table1 是 char(36)
而 Table2 是 varchar(36)
;这导致了强制转换和广播,因为 char 和 varchar 的散列(可能)不同。 (varchar 将有一个长度前缀,可能包含在哈希中...... :-( )
连接上的数据类型必须完全相同,而不是几乎相同。例如。 INT
到 BIGINT
可能会有同样的问题。
(还没有检查过这个,但可能甚至可以为空?)
【讨论】:
以上是关于Redshift 中的 GROUP BY 后不必要的 DS_BCAST_INNER的主要内容,如果未能解决你的问题,请参考以下文章
在 Amazon Redshift 中使用窗口函数时需要 GROUP BY 聚合
AWS Redshift 列“view_table_B.cost”必须出现在 GROUP BY 子句中或用于聚合函数