我知道托管对于Netezza中的分布式连接很重要。在高层次上,它具有以下定义:Netezza - 在SQL的角度来看,什么是主机托管?
All data for joins are located in the same SPU
我也谈到了一些Netezza公司员工在过去,他们提到,加入被视为同一地点,如果所有表分发和加入相同的列。
不过,我还是觉得这个定义有点欠缺......根据我的理解1相和2相GROUP BY的,我怀疑真的托管运行在如下的定义:
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的建议下,我重新的定义,同位为加盟:
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
我明白了。所以我提出的定义是要求#1。在#2上,如果表A分布在A.CustomerName上,则表B分布在CardholderName上,并且我们在A.CustomerName = B.CardholderName上有Join。我认为那不会是共同本地化的。那么认为“同一”专栏的一种方式是,条件必须使得LHS和RHS必须具有PK-FK关系或两者都是FK指向相同的PK?至于要求3,这是我第一次看到它提到。我知道这是HASH JOIN所必需的。那么我可以假设共位联接的前提条件是它必须是HASH吗? – user1836155 2015-02-10 21:41:54
我认为,我编辑了我的回复,以澄清这一点,就像您发表评论一样。对于#2,只有列中的内容散列为相同的值才是重要的。因此,对于“表A分布在A.CustomerName上,表B分布在CardholderName上,并且我们在A.CustomerName = B.CardholderName上有联合”,只要CustomerName和CardholderName都是varchar,那么您可以有一个共同连接,因为两者中的“SMITH”都会哈希到相同的值。对于#3,让我补充更多的答案来澄清。 – ScottMcG 2015-02-10 21:53:52
有趣。因此,让我尝试对协作需求做一个简单的形式化:(1)JOIN必须是HASH/MERGE SORT JOIN,并且(2)连接所需的一组列必须是每个表的分配键。至于JOIN类型,是否有一个页面能够很好地满足他们的需求和性质?我唯一能找到的就是HASH JOIN需要等号和相同类型,EXIST JOIN是一种特殊类型的HASH JOIN,而NESTED LOOP JOIN是baddddd。如果有必要,我可以提出一个新的问题 – user1836155 2015-02-10 22:55:37