我有一个问题,想知道是否有解决办法。
我的查询中有绝对不必要的表广播(ds-bcast-u-inner)。
假设表1和表2都有相同的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 ....
我在explain命令显示的执行计划中看到了ds_bcast_inner,但它显然是无用的。
我怎样才能避免呢?
最佳答案
在上面运行EXPLAIN
并查看表的基础数据类型(在group by之前)。
我最近看到了这样的情况:表1是一个char(36)
而表2是一个varchar(36)
;这导致了一个cast和一个广播,因为char和varchar的散列(可能)是不同的。(varchar的长度前缀可能包含在哈希中…:-()
连接上的数据类型必须完全相同,而不是几乎相同。例如,aINT
到aBIGINT
可能会有相同的问题。
(没有检查过,但可能是无效的?)