我知道托管对于 Netezza 中的分布式连接很重要。在高层次上,它具有以下定义:
All data for joins are located in the same SPU
过去我还与一些 Netezza 员工交谈过,他们提到如果所有表在相同的列上分布和连接,则连接被认为是共置的。
但是,我仍然觉得定义有点欠缺……根据我对 1-phase 和 2-phase 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