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 将有一个长度前缀,可能包含在哈希中...... :-( )

连接上的数据类型必须完全相同,而不是几乎相同。例如。 INTBIGINT 可能会有同样的问题。

(还没有检查过这个,但可能甚至可以为空?)

【讨论】:

以上是关于Redshift 中的 GROUP BY 后不必要的 DS_BCAST_INNER的主要内容,如果未能解决你的问题,请参考以下文章

RedShift GROUP BY 常量列给出不一致的结果

在 Amazon Redshift 中使用窗口函数时需要 GROUP BY 聚合

AWS Redshift 列“view_table_B.cost”必须出现在 GROUP BY 子句中或用于聚合函数

为啥一个 group by 的聚合这么慢?

所选项目不必出现在 GROUP BY 子句中或在聚合函数中使用

[Database] Oracle 中的where 可以后接group by