我知道托管对于Netezza中的分布式连接非常重要。从较高的层面来看,它有以下定义:
All data for joins are located in the same SPU
我过去也和一些Netezza员工交谈过,他们提到如果所有表都在同一列上分发和加入,则认为联接是共同的。
然而,我仍然认为定义有点缺乏...基于我对1阶段和2阶段GROUP BY的理解,我怀疑colocation真的按照以下定义运行:
A join is considered colocated if the set of columns used in the join condition is a superset of the distribution keys of all participating tables.
这是正确的定义吗?我试着在新西兰寻找一个精确的托管定义,但我得到的是一堆文章,有点假设你已经知道了这个定义。
对此的输入将不胜感激。谢谢!
编辑:基于ScottMcG的建议,我重新定义了colocated join的定义:
1. It must be a HASH or MERGE SORT JOIN
2. Set of columns in join conditions must be superset of all distribution keys of all participating tables
3. ?
? #3的标记是我需要解决的歧义。根据ScottMcG,每个表的分发键也必须相互连接。
假设表A,B,C分布在文本列A.C1,A.C2,B.C3,B.C4,C.C5和C.C6上,我们有以下连接。
SELECT * FROM A
INNER JOIN B "Join1"
ON A.C1=B.C3
INNER JOIN C "Join2"
ON A.C2=B.C4
AND A.C2=C.C6
AND [X]
现在,让我们提供一些[X]的可能定义。那么[X]的定义是否会将Join2合并?
(1) [X] = A.C2 = 5
(2) [X] = A.C2 = B.C1 OR A.C2 = C.C5
(3) [X] = A.C1 IS NULL
(4) [X] = A.NonKeyColumn1 = B.NonKeyColumn2
答案 0 :(得分:1)
对于Netezza,当连接中涉及的表不需要从它们永久驻留的数据切片中重新分发或广播时,连接被认为是共处的,以便执行连接。
只有在以下情况下才会发生这种情况:
这些条件非常接近您在定义中提出的条件,并且必须允许但不足以确保共置联接。优化器可能会决定预先广播其中一个表,如果它们足够小,即使它们分布在相同的列上,那么从技术上讲,它不会是共同连接。
我应该补充的一点是,要将列视为"相同"作为另一列,列值应该散列为相同的值。一般来说,这意味着列数据类型将是相同的。一个例外是数据类型的整数族(byteint,smallint,int,bigint)只要它们在支持的范围内就会哈希到相同的值。
关于连接类型的影响,equijoins将是这种形式。请注意,这可能是散列连接或合并排序连接(如果数据类型可能是浮点)。在任何一种情况下,我们都不需要重新分配数据。在这些示例中,两个表都分布在COL1上。
SELECT ...
FROM TableA A
JOIN TableB B
ON A.COL1 = B.COL1
如果连接是基于表达式的连接(如下所示)之一,那么您将最终重新分发或广播数据。对于"小于" join,你必须能够确定8小于9,但由于它们都将被散列到不同的数据切片,所以只有当一个被重新定位到另一个数据切片时才能进行比较。
SELECT ...
FROM TableA A
JOIN TableB B
ON A.COL1 < B.COL1
SELECT ...
FROM TableA A
JOIN TableB B
ON A.COL1 - B.COL1 = 0